SQL Server面试题实战:分组计胜负次数

需积分: 13 20 下载量 49 浏览量 更新于2024-11-07 收藏 33KB DOC 举报
在SQL Server的经典面试题中,有一道关于GROUP BY操作的问题,考察的是如何根据特定条件对数据进行计数和分组。面试者可能希望测试求职者的SQL查询能力和对聚合函数的理解。 题目背景是有一个名为`#tmp`的临时表,其中包含比赛日期`rq`和比赛结果`shengfun`,结果包括胜('胜')和负('负')。表中有重复的比赛日期,每个日期都有胜负记录。面试者要求编写SQL语句来统计每个比赛日期的胜场和负场次数,并按照日期`rq`进行汇总。 1. 第一种方法是使用CASE WHEN语句,结合SUM函数,分别计算胜场和负场的总和: ```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来实现: ```sql SELECT N.rq AS rq, COUNT(*) AS 勝, M.COUNT(*) AS 负 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 GROUP BY N.rq; ``` 这里首先分别计算每个日期的胜场和负场次数,然后将这两个子查询通过比赛日期关联起来。 3. 最后一种方法涉及两个表`temp1`,但题目给出的信息不完整,无法直接应用在这个场景。如果`temp1`表与`#tmp`表有某种关系(比如`col002`对应`shengfu`),则可能需要基于这个关系进行查询。假设`temp1`表也包含了比赛结果,可以这样写: ```sql SELECT t1.col001 AS col001, COUNT(CASE WHEN t1.col002 = '胜' THEN t1.col001 END) AS a1胜, COUNT(CASE WHEN t1.col002 = '负' THEN t1.col001 END) AS b1负 FROM temp1 t1 GROUP BY t1.col001; ``` 这个查询是针对`temp1`表的,可能不符合原题目的需求,但如果这是一个额外的提示,可能表示面试者期望求职者展示如何在更复杂的数据结构中进行分组和计数。 这个问题旨在测试求职者如何有效地利用GROUP BY、JOIN、CASE WHEN和COUNT等SQL核心功能,同时理解如何根据具体业务逻辑来构建查询。对于实际面试,理解和灵活运用这些技术至关重要。