今天看到一个同学吐槽在面试拼多多的时候遇到面试官迟到,并且全程态度很差。
让面试官帮忙纠正解答一下,只是说肯定回答的不对,并没有给解答。
下面分享一道大厂的SQL面试题
题目
有如下ABC三列和几组数据
想得到如下结果
该如何写查询?
解释:结果是对A列进行分组,对B列进行求和,当同一组的C列数据不同时返回1,当同一组的C列数据相同时则返回C列的值即可。例如 aaa组,B列求和为3,C列因为X和Y不相同,则返回为1
参考答案
create table T20191103
(A varchar(20),
B int,
C varchar(20)
);
insert into T20191103 values ('aaa',1,'X');
insert into T20191103 values ('aaa',2,'Y');
insert into T20191103 values ('bbb',3,'X');
insert into T20191103 values ('bbb',4,'X');
insert into T20191103 values ('ccc',5,'Y');
insert into T20191103 values ('ccc',6,'Y');
--MySQL 8.0和SQL Server
select a.A,a.B,
case when D=2 then '1' else E end AS C
FROM (
SELECT A,
SUM(B) B,
COUNT(distinct C) as D,
MIN(C) as E from T20191103 group by A) a
答案解析
1、 从题目要求来看,是要求对A列进行分组,对B列进行SUM求和,但是C列并非简单的聚合。
2、 当同一组的C不同时返回1,当同一组的C相同是返回C。而有这种条件判定的通常我们会使用CASE WHEN来进行求解。
3、 但是我们该如何判断C呢?这里的解法比较巧妙,当C不同的时候,我们发现他们去重后的数量是2,C相同时,他们去重后的数量是1,因此我们可以通过C列去重后的数量来判定。
4、 判定完之后,我们最后通过CASE WHEN的子查询即可完成条件转换输出了。
今天的分享就到这里,希望大家能有所收获~
你好,我是岳哥,毕业于一所普通二本院校,从一名数据库工程师成长为团队负责人,拥有11年数据行业的工作经验。
曾经,我用3年时间将公众号粉丝做到10w粉丝,微信好友2w+,副业收入超过7位数。