題目1:客戶活躍度
有一個表VUA,裏面有ID,DATE兩個變量,
要選出在3.5號出現的用戶ID,在後三天3.21-3.23出現的總次數統計
建表語句:
create table vua
(
id varchar(20) not null,
date datetime
);
insert into vua values('1','3-5');
insert into vua values('1','3-6');
insert into vua values('1','3-7');
insert into vua values('1','3-8');
insert into vua values('2','3-5');
insert into vua values('2','3-6');
insert into vua values('2','3-8');
insert into vua values('3','3-5');
insert into vua values('3','3-6');
insert into vua values('3','3-7');
insert into vua values('4','3-5');
insert into vua values('4','3-5');
解答:
select ID,COUNT(ID)
FROM vua A
WHERE A.DATE BETWEEN '3-6'AND '3-8'
AND ID IN
(
SELECT DISTINCT ID FROM vua WHERE DATE='3-5'
)
GROUP BY ID
輸入輸出結果:
題目2:得分排名
求每一門科目,成績排名前兩名的同學
建表語句:
create table tabscore(
c_id varchar(20) not null ,
stuID varchar(40) not null,
score varchar(40) not null
);
INSERT INTO tabscore VALUES ('1', '1', '85.0');
INSERT INTO tabscore VALUES ('2', '1', '89.0');
INSERT INTO tabscore VALUES ('1', '2', '85.0');
INSERT INTO tabscore VALUES ('2', '2', '80.0');
INSERT INTO tabscore VALUES ('1', '3', '85.0');
INSERT INTO tabscore VALUES ('2', '3', '99.0');
解答:
select * from(
select c_id,stuID,score,
row_number() over(partition by c_id order by score desc) rank
from tabscore ) t
where rank <=2
select a.c_id,a.stuID,
(select count(distinct score) from tabscore
where c_id =a.c_id and score >=a.score group by c_id) rank
from tabscore a
order by a.c_id
輸入輸出結果:
題目3:行列轉置
1.縱行轉橫行
建表語句:
create table vua
(
ID varchar(20) not null,
ITEM varchar(20) not null,
SCORE varchar(20) not null
);
insert into vua values('1','A','98');
insert into vua values('1','B','89');
insert into vua values('1','C','78');
insert into vua values('2','A','79');
insert into vua values('2','B','88');
insert into vua values('2','C','100');
解答:
select ID,
SUM( CASE ITEM WHEN 'A' THEN SCORE ELSE 0 END) AS 'A',
SUM( CASE ITEM WHEN 'B' THEN SCORE ELSE 0 END) AS 'B',
SUM( CASE ITEM WHEN 'C' THEN SCORE ELSE 0 END) AS 'C'
from vua group by ID
輸入輸出結果:
2.橫行轉縱行
建表語句:
create table vua
(
ID varchar(20) not null,
A varchar(20) not null,
B varchar(20) not null,
C varchar(20) not null
);
insert into vua values('1','98','89','78');
insert into vua values('2','79','88','100');
解答:
select ID,'A' AS ITEM, A AS 'SCORE'
from vua
UNION ALL
select ID,'B' AS ITEM, B AS 'SCORE'
from vua
UNION ALL
select ID,'C' AS ITEM, C AS 'SCORE'
from vua
ORDER BY ID ASC
輸入輸出結果:
也可以使用sql server中自帶的函數Pivot來轉化
縱行轉橫行
select
ID,
t2.A,
t2.B,
t2.C
from vua as t1
pivot (sum(SCORE) for ITEM in(A,B,C)) as t2
橫行轉縱行
select
*
from
vua t2
unpivot (SCORE for ITEM in (A,B,C)) as t3