SQL面试题解析:统计胜负情况

3星 · 超过75%的资源 需积分: 33 4 下载量 104 浏览量 更新于2024-09-16 收藏 50KB DOC 举报
"这篇内容主要涉及SQL语句在面试中的应用,特别关注如何通过SQL查询得到特定的统计结果。" 在SQL面试中,经常会遇到一些需要处理数据统计的问题,这里我们探讨一个具体的例子,该例子涉及到`GROUP BY`语句的使用。题目要求根据日期(rq)统计每天的胜(shengfu)负(fu)场次,得到如下结果: ``` 胜负 2005-05-09 2005-05-10 胜 2 1 负 2 2 ``` 给出的三种解题方法如下: 1. 使用`CASE WHEN`和`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; ``` 这种方法直接在单个查询中处理了胜利和失败的计数,通过`CASE WHEN`将非数值字段转换为数值,然后使用`SUM`进行累加。 2. 使用两次`GROUP BY`并进行`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; ``` 这种方法首先分别计算胜和负的次数,然后通过`INNER JOIN`将结果合并。 3. 利用子查询和`JOIN`: ```sql SELECT a.rq, a.a1 AS '胜', b.b1 AS '负' FROM ( SELECT rq, COUNT(rq) AS a1 FROM #tmp WHERE shengfu = '胜' GROUP BY rq) a, ( SELECT rq, COUNT(rq) AS b1 FROM #tmp WHERE shengfu = '负' GROUP BY rq) b WHERE a.rq = b.rq; ``` 这种方法与第二种类似,也是通过两个子查询先获取胜和负的计数,然后利用`JOIN`来组合结果。 对于第二个问题,虽然没有提供完整的信息,但我们可以推测是询问如何在A列有特定值时查询B列和C列的对应数据。一种可能的查询方式是: ```sql SELECT B, C FROM 表名 WHERE A = '特定值'; ``` 这将返回所有A列值等于'特定值'时对应的B列和C列的值。 理解并掌握这些SQL查询技巧对于面试和实际工作中处理数据统计问题至关重要。在面试中,面试官可能会通过这类问题来评估你的SQL功底、逻辑思维能力和解决问题的能力。所以,熟练运用SQL的聚合函数、条件判断以及子查询等概念,是提升SQL技能的关键。