面試中常見的三個SQL問題及詳解總結

題目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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章