SQL面试必备:经典题解析——统计胜负记录

需积分: 10 16 下载量 147 浏览量 更新于2024-09-09 收藏 29KB DOC 举报
"这篇文档包含了SQL的经典面试题及其答案,主要关注的是如何使用SQL进行数据分组和计数,特别是涉及到GROUP BY语句的应用。" 在SQL面试中,经常会遇到涉及数据聚合和分类的问题,本题就是这样一个例子。题目要求根据日期(rq)统计每个日期中“胜”和“负”的次数,输出格式为日期后面分别跟随胜和负的次数。以下三个SQL语句给出了不同的解决方案: 1. 第一个查询使用了CASE语句和GROUP BY语句。CASE语句在这里用于根据胜或负的情况将1或0分配给每个记录,然后通过SUM函数对每个日期的胜和负进行求和。GROUP BY语句按照日期进行分组,确保统计结果按日期划分。 ```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. 第二个查询采用了子查询和INNER JOIN的方法。首先,创建两个子查询,分别计算出每个日期的胜和负的次数,然后通过INNER JOIN将这两个子查询的结果合并,依据日期进行匹配。 ```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. 第三个查询同样使用了子查询,但这里每个子查询返回的是一个带有计数的列,然后通过这些列进行JOIN操作。这种方法也是基于GROUP BY对数据进行分类和计数。 ```sql SELECT a.col001, a.a1 '胜', b.b1 '负' FROM ( SELECT col001, COUNT(col001) AS a1 FROM temp1 WHERE col002 = '胜' GROUP BY col001 ) a, ( SELECT col001, COUNT(col001) AS b1 FROM temp1 WHERE col002 = '负' GROUP BY col001 ) b WHERE a.col001 = b.col001; ``` 这三个解决方案虽然语法结构不同,但都能达到预期的效果,即按日期展示“胜”和“负”的数量。理解并掌握这些方法对于处理类似的数据聚合问题非常有帮助,特别是在实际工作中分析和报告数据时。在SQL面试中,展示你对数据处理的不同方法和对SQL语句灵活性的理解是至关重要的。