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

需积分: 33 5 下载量 133 浏览量 更新于2024-10-01 1 收藏 50KB DOC 举报
在SQL语句面试题中,面试者经常被问及如何处理数据聚合和计数的问题。以下是一些常见的问题和解决方案: 1. 题目要求统计每个日期的胜场和负场次数,给出的比赛结果记录在`#tmp`表中,字段包括日期`rq`和比赛结果`shengfu`。题目要求的结果格式是日期和对应的胜败次数,例如'2005-05-09' 22(胜2次,负2次)和'2005-05-10' 12(胜1次,负2次)。这里提供了三种可能的SQL语句来实现这个目标: - 第一种方法使用`CASE`语句和`SUM()`函数,计算每条记录的胜败值并按日期分组: ``` 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; ``` 这个查询会返回每条日期及其对应的胜败计数。 - 第二种方法利用子查询,通过`INNER JOIN`连接两个分别统计胜败次数的子查询: ``` 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; ``` 这里首先计算每个日期的胜败数量,然后通过日期匹配合并结果。 - 第三种方法使用两个独立的`SELECT`语句,分别对胜败情况进行计数,然后通过`WHERE`子句筛选出相同日期的记录: ``` SELECT a.rq, a.a1 as 胜, b.b1 as 负 FROM ( SELECT rq, COUNT(rq) as a1 FROM #tmp WHERE shengfu = '胜' GROUP BY rq ) a JOIN ( SELECT rq, COUNT(rq) as b1 FROM #tmp WHERE shengfu = '负' GROUP BY rq ) b ON a.rq = b.rq; ``` 这里同样基于日期进行匹配,并计算各自的胜败计数。 2. 另一个问题涉及一张包含A、B、C三列的表,要求实现特定条件的查询,但题目没有给出具体条件。如果需要根据A列的某个值过滤数据,比如查找A列等于某个值的所有行,可以使用`WHERE`子句。假设我们想找出A列等于'def'的所有行: ``` SELECT * FROM 表名 WHERE A = 'def'; ``` 如果需要统计符合条件的行数,可以替换`*`为`COUNT(*)`,例如: ``` SELECT COUNT(*) FROM 表名 WHERE A = 'def'; ``` 以上两种情况都展示了在SQL查询中处理条件过滤和数据聚合的基本技巧。面试时,熟悉这些操作并且能够灵活运用是关键。