RFID課程前置——SQL鞏固練習
近期在上RFID技術課程,前期要求鞏固SQL知識,課上做了下面幾道練習題,由此記錄一下
先把以下程式複製到新查詢視窗中執行:
create database EX30918 -- 建立表 create table T_CallRecords( id int not null, CallerNumber varchar(3), TellNumber varchar(13), StartDateTIme datetime, EndDateTime datetime, Primary key(Id) ); --插入資料 insert into T_CallRecords(Id,CallerNumber,TellNumber,StartDateTime,EndDateTIme) values(1,'001','02088888888','2010-7-10 10:01','2010-7-10 10:05'); INSERT INTO T_CallRecords(Id,CallerNumber,TellNumber,StartDateTime,EndDateTime) VALUES (2,'002','02088888888', '2010-7-11 13:41','2010-7-11 13:52'); INSERT INTO T_CallRecords(Id,CallerNumber,TellNumber,StartDateTime,EndDateTime) VALUES (3,'003','89898989', '2010-7-11 14:42', '2010-7-11 14:49'); INSERT INTO T_CallRecords(Id,CallerNumber,TellNumber,StartDateTime,EndDateTime) VALUES (4,'004','02188368981', '2010-7-13 21:04', '2010-7-13 21:18'); INSERT INTO T_CallRecords(Id,CallerNumber,TellNumber,StartDateTime,EndDateTime) VALUES (5,'005','76767676', '2010-6-29 20:15', '2010-6-29 20:30'); INSERT INTO T_CallRecords(Id,CallerNumber,TellNumber,StartDateTime,EndDateTime) VALUES (6,'006','02288878243', '2010-7-15 13:40', '2010-7-15 13:56'); INSERT INTO T_CallRecords(Id,CallerNumber,TellNumber,StartDateTime,EndDateTime) VALUES (7,'007','67254686', '2010-7-13 11:06', '2010-7-13 11:19'); INSERT INTO T_CallRecords(Id,CallerNumber,TellNumber,StartDateTime,EndDateTime) VALUES (8,'008','8623<st1:rtx w:st="on">1445</st1:rtx>', '2010-6-19 19:19', '2010-6-19 19:25'); INSERT INTO T_CallRecords(Id,CallerNumber,TellNumber,StartDateTime,EndDateTime) VALUES (9,'009','87422368', '2010-6-19 19:25', '2010-6-19 19:36'); INSERT INTO T_CallRecords(Id,CallerNumber,TellNumber,StartDateTime,EndDateTime) VALUES (10,'010','40045862245', '2010-6-19 19:50', '2010-6-19 19:59'); --修改呼叫員編號 UPDATE T_CallRecords SET CallerNumber='001' WHERE Id IN (1,2,3,6,9); UPDATE T_CallRecords SET CallerNumber='002' WHERE Id IN (4,5); UPDATE T_CallRecords SET CallerNumber='003' WHERE Id IN (7,8); UPDATE T_CallRecords SET CallerNumber='004' WHERE Id=10; --資料彙總 select * from T_CallRecords
顯示的結果如下:

根椐上面的表完成以下題目:
-- 1) 輸出所有資料中通話時間最長的5條記錄。
select top 5 *, DATEDIFF(second,StartDateTime,EndDateTime) as 'SpanTimex' from T_CallRecords order by 'SpanTimex' Desc

-- 2) 輸出所有資料中撥打長途號碼(對方號碼以0開頭)的總時長。
--輸出所有資料中撥打長途號碼 select *,DATEDIFF(second,StartDateTIme,EndDateTime) as 'Total_SpanTimex'from T_CallRecords where TellNumber like '0%'

-- 輸出所有資料中撥打長途號碼(對方號碼以0開頭)的總時長 select sum(DATEDIFF(second,StartDateTIme,EndDateTime)) as 'Total_SpanTimex'from T_CallRecords where TellNumber like '0%'

-- 3) 輸出在2010年7月通話總時長最多的前三個呼叫員的編號。
--主要思路: --算出2010-7到現在時間的月數month,資料中起始時間到現在時間等於month的,即2010年7月的記錄 --sum(DATEDIFF(second,StartDateTIme,EndDateTime))算出通話總時長 select top 3 CallerNumber,sum(DATEDIFF(second,StartDateTIme,EndDateTime)) as 'Total_SpanTimex' from T_CallRecords where DATEDIFF(month,StartDateTIme,getdate())=(select DATEDIFF(month,'2010-7-1',getdate())) group by CallerNumber order by 'Total_SpanTimex' desc

-- 4) 輸出2010年7月撥打電話次數最多的前三個呼叫員的編號。
select top 3 CallerNumber, count(*) from T_CallRecords where DATEDIFF(month,StartDateTIme,getdate())=(select DATEDIFF(month,'2010-7-1',getdate())) group by CallerNumber

-- 5) 輸出所有資料的撥號流水,並且在最後一行新增總呼叫時長。
-- 記錄呼叫員編號、對方號碼、通話時長
--...
-- 彙總[市內號碼總時長][長途號碼總時長]
-- 5) 輸出所有資料的撥號流水,並且在最後一行新增總呼叫時長。 -- 記錄呼叫員編號、對方號碼、通話時長 -- ...... -- 彙總[市內號碼總時長][長途號碼總時長] --取對應的列,轉化型別; --因為兩個表加在一起,列的屬性要一樣!!! select convert(nvarchar(50),CallerNumber) as N'呼叫員編碼' , convert(nvarchar(50),TellNumber) as N'對方號碼', convert(nvarchar(50),DATEDIFF(second,StartDateTIme,EndDateTime)) as N'通話時長' from T_CallRecords union all select '彙總', -- (select sum(DATEDIFF(second,StartDateTIme,EndDateTime)) from T_CallRecordswhere TellNumber not like '0%')算出市內號碼總時長 --convert(nvarchar(50), (select sum(...) from T_CallRecordswhere TellNumber not like '0%')) 轉換型別方便轉型 --select (select '市內號碼總時長:' + convert(nvarchar(50), (select sum(DATEDIFF(second,StartDateTIme,EndDateTime)) from T_CallRecords where TellNumber not like '0%')) + '秒'),--注意逗號!!!,兩個逗號連線三個列為一行 (select '長途號碼總時長:' + convert(nvarchar(50), (select sum(DATEDIFF(second,StartDateTIme,EndDateTime)) from T_CallRecords where TellNumberlike '0%')) + '秒')
