SQL面试题集:按日期统计胜负

需积分: 13 0 下载量 124 浏览量 更新于2024-09-18 收藏 33KB DOC 举报
在SQL面试中,关于GROUP BY的题目是常见的一类考察点,这道题目涉及到对表格数据进行分组并计算每个分组的特定条件下的计数。给出的问题背景是一个名为`#tmp`的临时表,其中包含了比赛日期`rq`和比赛结果`shengfu`,数据包括了多个比赛日的胜利和失败情况。 题目要求根据`rq`字段生成两个结果:一是每场比赛日的胜利次数(记为“胜”),二是失败次数(记为“负”)。下面是三种可能的SQL查询方式: 1. 使用SUM()函数和CASE WHEN子句: ```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语句分别计数胜利和失败。 2. 使用连接和子查询: ```sql SELECT N.rq, N.勝, M.負 FROM ( SELECT rq, COUNT(*) AS '勝' FROM #tmp WHERE shengfu = '胜' GROUP BY rq ) N INNER JOIN ( SELECT rq, COUNT(*) AS '負' FROM #tmp WHERE shengfu = '负' GROUP BY rq ) M ON N.rq = M.rq; ``` 这里首先对胜利和失败的比赛进行分组计数,然后通过INNER JOIN将两个计数结果表连接在一起,依据比赛日`rq`相同。 3. 使用间接的方式,假设有一个`temp1`表与`#tmp`表有相似结构,但只包含'胜'的结果,可以这样计算: ```sql SELECT a.col001, a.a1 AS '胜', b.b1 AS '负' FROM ( SELECT col001, COUNT(*) AS a1 FROM temp1 WHERE col002 = '胜' GROUP BY col001 ) a LEFT JOIN ( -- 假设b表用于统计失败次数,需类似构造 ) b ON a.col001 = b.col001; ``` 此查询先在`temp1`中计算胜利次数,然后通过LEFT JOIN关联一个假设存在的失败计数表`b`。 以上三种方法都可以解决这个问题,面试时可以根据自己的理解和偏好选择最合适的解决方案。同时,面试官可能会关注到查询的效率、性能优化以及对SQL聚合函数和连接操作的理解程度。