SQL練習筆記

黑馬程序員——SQL練習筆記

例題1:
表名TableScore
ID Date Name Score
1 2008-8-8 拜仁 勝
2 2008-8-9 奇才 勝
3 2008-8-9 湖人 勝
4 2008-8-10 拜仁 負
5 2008-8-8 拜仁 負
6 2008-8-12 奇才 負
要求輸出下面格式:
Name 勝 負
拜仁 1 2
湖人 1 0
奇才 2 0

本人自己的解法:
select distinct Name,
(case Name
when N'拜仁' then (select count(*) from TableScore where Score='勝' and Name='拜仁')
when N'湖人' then (select count(*) from TableScore where Score='勝' and Name='湖人')
when N'奇才' then (select count(*) from TableScore where Score='勝' and Name='奇才')
end
) as 勝,
(case Name
when N'拜仁' then (select count(*) from TableScore where Score='負' and Name='拜仁')
when N'湖人' then (select count(*) from TableScore where Score='負' and Name='湖人')
when N'奇才' then (select count(*) from TableScore where Score='負' and Name='奇才')
end
) as 負
from TableScore

楊老師的解法:
select Name,
sum(
case Score
when N'勝' then 1
else 0
end
)as 勝,
sum(
case Score
when N'負' then 1
else 0
end
)as 負
from TableScore
group by Name

例題2:
創建一張表,記錄電話呼叫員的工作流水,記錄呼叫員編號,對方號碼,通話開始時間,通話結束時間

。建表,查數據最好都自己寫SQL語句。
要求:
(1)輸出所有數據中通話時間最長的5條記錄;
(2)輸出所有數據中撥打長途號碼(對方號碼以0開頭)的總時長;
(3)輸出本月通話時間最多的前三個呼叫員的編號;
(4)輸出本月撥打電話次數最多的三個呼叫員編號;
(5)輸出所有數據的撥號流水,並且在最後一行添加總呼叫次數
輸出的撥號流水包括呼叫員編號,對方號碼,通話時長。彙總包括市內號碼總時長,長途號碼總時長。

--創建數據表:
use Test
create table TableHuJiao
(
Id int not null identity(1,1) primary key,
UserId nvarchar(50) not null,
PhoneNumber nvarchar(12) not null,
StartTime datetime not null,
EndTime datetime not null
)
--添加數據:
use Test
insert into TableHuJiao values('2','15226018422','2009-01-01 12:32:12','2009-01-01 12:52:12')
insert into TableHuJiao values('3','015226018432','2010-5-2 10:32:12','2010-5-2 12:52:12')
insert into TableHuJiao values('4','015226018442','2010-5-01 12:32:12','2010-5-01 12:42:12')
insert into TableHuJiao values('5','15226018452','2010-6-2 12:32:12','2010-6-2 13:52:12')
insert into TableHuJiao values('6','15226018462','2011-01-1 12:32:12','2011-01-1 12:33:12')
insert into TableHuJiao values('7','15226018472','2011-2-2 12:32:12','2011-2-2 15:00:12')
insert into TableHuJiao values('8','15226018482','2011-3-4 12:32:12','2011-3-4 12:44:12')
insert into TableHuJiao values('9','015226018422','2011-4-3 12:32:12','2011-4-3 12:54:12')
insert into TableHuJiao values('1','15226018422','2011-5-5 12:32:12','2011-5-5 12:45:12')
insert into TableHuJiao values('3','015226018492','2011-6-7 12:32:12','2011-6-7 12:37:12')
insert into TableHuJiao values('2','15226018412','2011-7-6 12:32:12','2011-7-6 12:39:12')
insert into TableHuJiao values('1','15226018422','2011-8-9 12:32:12','2011-8-9 12:40:12')
insert into TableHuJiao values('5','15226018422','2011-9-8 12:32:12','2011-9-8 12:41:12')
insert into TableHuJiao values('11','015226018452','2011-10-21 12:32:12','2011-10-21 12:43:12')
insert into TableHuJiao values('4','15226018462','2011-11-12 12:32:12','2011-11-12 12:55:12')
insert into TableHuJiao values('5','15226018422','2011-11-5 12:32:12','2011-11-5 17:41:12')
insert into TableHuJiao values('11','015226018452','2011-11-6 12:32:12','2011-11-6 14:43:12')
insert into TableHuJiao values('4','15226018462','2011-11-12 12:32:12','2011-11-12 15:55:12')
insert into TableHuJiao values('11','015226018452','2011-11-6 12:32:12','2011-11-6 14:43:12')
insert into TableHuJiao values('4','15226018462','2011-11-12 12:32:12','2011-11-12 15:55:12')

--1)輸出所有數據中通話時間最長的5條記錄;
--我的解法:
use Test
select top 5 * from
(
select UserId as 呼叫員編號, PhoneNumber as 對方號碼,
datediff(second,StartTime,EndTime) as 通話時長
from TableHuJiao
)tr
order by 通話時長 desc
--老師的解法:
select top 5 * from TableHuJiao
order by datediff(second,StartTime,EndTime) desc

--2)輸出所有數據中撥打長途號碼(對方號碼以0開頭)的總時長;
--我的解法:
select UserId as 呼叫員編號,PhoneNumber as 對方號碼,
datediff(second,StartTime,EndTime) as 通話時長
from TableHuJiao
where PhoneNumber like '0%'
order by 通話時長 desc
--老師的解法:
select sum(datediff(second,StartTime,EndTime)) from TableHuJiao
where PhoneNumber like '0%'

--3)輸出本月通話時間最多的前三個呼叫員的編號;

--老師的解法:
select top 3 UserId from TableHuJiao
where datediff(month,StartTime,getdate())=0
group by UserId
order by sum(datediff(second,StartTime,EndTime)) desc

--4)輸出本月撥打電話次數最多的三個呼叫員編號;
--我的解法:
select top 3 * from
(
select distinct UserId as 呼叫員編號, count(UserId) as 呼叫次數 from TableHuJiao
where Datediff(month,StartTime,getdate())=0
group by UserId
)tr
order by 呼叫次數 desc
--老師的解法:
select UserId,count(*) from TableHuJiao
where Datediff(month,StartTime,getdate())=0
group by UserId
order by count(*) desc

--5)輸出所有數據的撥號流水,並且在最後一行添加總呼叫次數
--輸出的撥號流水包括呼叫員編號,對方號碼,通話時長。彙總包括市內號碼
--總時長,長途號碼總時

長。

--老師的解法:
select UserId as 呼叫員編號,PhoneNumber as 對方號碼,
datediff(second,StartTime,EndTime) as 通話時長
from TableHuJiao

union allselect '彙總',convert(nvarchar(12),

sum
(

(case

when PhoneNumber not like '0%' then datediff(second,StartTime,EndTime)else 0

end)
))as 市內通話,sum
(

(case

when PhoneNumber like '0%' then datediff(second,StartTime,EndTime)

else 0

end)) as 長途通話

from TableHuJiao

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章