题目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