SQL面试必备:经典题目与解答解析

1星 需积分: 39 179 下载量 66 浏览量 更新于2024-07-20 5 收藏 135KB DOC 举报
"这篇资源是关于SQL面试题的解答,主要涵盖了一道涉及GROUP BY的题目,目的是展示如何统计特定日期的胜利和失败次数。" 在SQL面试中,GROUP BY语句是一个重要的概念,用于根据一个或多个列对数据进行分组。在给出的面试题中,目标是得到每日期(rq)的胜场('胜')和负场('负')的计数。以下是三种不同的解题方法: 1. 第一种方法利用了CASE WHEN语句来计算胜场和负场。首先,CASE WHEN语句检查shengfu字段是否等于'胜'或'负',如果是,则返回1,否则返回0。然后,使用SUM函数对每个日期的胜场和负场进行求和。GROUP BY子句按照日期(rq)进行分组。 ```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. 第二种方法使用了两次嵌套的SELECT语句,分别计算胜场和负场的数量,然后通过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. 第三种方法也使用了两个嵌套的SELECT语句,但这次是在一个FROM子句中并行定义的。两个子查询分别计算'胜'和'负'的计数,并通过col001(这里假设对应于日期)将它们连接起来。这种方法适用于有不同列名表示胜败情况的情况。 ```sql SELECT a.col001, a.a1 AS '胜', b.b1 AS '负' 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在处理分类统计时的灵活性,同时也考察了面试者对聚合函数、条件逻辑和JOIN操作的理解。在实际工作中,理解并熟练运用这些技巧对于数据库查询和数据分析至关重要。