SQL面试题解析:Group by 实战练习

需积分: 10 32 下载量 110 浏览量 更新于2024-11-14 收藏 35KB DOC 举报
"这篇资料提供了一些SQL面试题和练习,主要关注如何使用SQL进行数据查询和聚合操作。其中举了一个具体的问题,要求根据日期(rq)统计每天的胜利(胜)和失败(负)次数。" 在SQL面试中,理解和熟练运用GROUP BY语句以及相关的聚合函数是至关重要的。这道题目就很好地展示了这些概念。以下是针对这个问题的三种不同解决方案: 1) 第一种方法使用了CASE WHEN语句和GROUP BY结合。CASE WHEN语句允许我们在SQL中根据条件返回不同的值。在这个例子中,我们对'shengfu'字段进行判断,当它等于'胜'时,我们计数为1,否则为0。然后通过SUM()函数分别累加胜和负的计数。 ```sql SELECT rq, SUM(CASE WHEN shengfu = '胜' THEN 1 ELSE 0 END) AS '胜', SUM(CASE WHEN shengfu = '负' THEN 1 ELSE 0 END) AS '负' FROM #tmp GROUP BY rq ``` 2) 第二种方法使用了子查询和JOIN。首先,我们为胜利和失败分别创建两个子查询,计算每个日期的胜场和负场数量,然后通过INNER JOIN将它们连接在一起,基于相同的日期(rq)。 ```sql SELECT N.rq, N.勝, M.負 FROM ( SELECT rq, 勝 = COUNT(*) FROM #tmp WHERE shengfu = '胜' GROUP BY rq ) N INNER JOIN ( SELECT rq, 負 = COUNT(*) FROM #tmp WHERE shengfu = '负' GROUP BY rq ) M ON N.rq = M.rq ``` 3) 第三种方法与第二种类似,但使用了别名(a 和 b)来表示胜利和失败的子查询,并且它们都是从临时表temp1中获取数据,这可能意味着原始数据是在一个不同的表中。这个方法同样使用了COUNT()函数和GROUP BY。 ```sql SELECT a.col001, a.a1胜, b.b1负 FROM ( SELECT col001, COUNT(col001) a1 FROM temp1 WHERE col002 = '胜' GROUP BY col001 ) a, ( SELECT col001, COUNT(col001) b1 FROM temp1 WHERE col002 = '负' GROUP BY col001 ) b WHERE a.col001 = b.col001 ``` 以上三种方法都能得到相同的结果,即按日期统计胜利和失败的次数。在实际面试中,选择哪种方式取决于个人对SQL的理解、习惯以及对特定数据库系统的熟悉程度。理解并能灵活运用这些方法对于提升SQL查询能力至关重要。