SQL面试必备:解决分组统计问题

需积分: 10 5 下载量 192 浏览量 更新于2024-09-18 收藏 29KB DOC 举报
"SQL Server 2005经典面试题,主要涉及如何使用SQL查询语句进行数据统计,尤其是GROUP BY和CASE语句的应用。" 在SQL Server 2005中,面试题经常涉及到对数据的分组和聚合操作,这在实际的数据分析和报告生成中是非常常见的需求。以下是一个典型的面试题目及其解答: 题目描述:有一张名为#tmp的临时表,其中包含两列:rq(日期)和shengfu(胜负)。表中的数据记录了每天的胜负情况,需要编写SQL语句得到如下结果: - rq(日期) - 胜(当天胜利的次数) - 负(当天失败的次数) 有三种不同的解决方案可以实现这个需求: 1) 使用CASE语句和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语句来判断shengfu列的值,当值为'胜'时返回1,否则返回0。然后通过SUM函数将这些1和0累加,分别得到胜利和失败的次数。 2) 使用子查询和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) 使用两个独立的子查询并联接: ```sql SELECT a.col001, a.a1胜, b.b1负 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; ``` 这个解法同样使用了子查询,但这里的假设是存在一个名为temp1的表,其结构与#tmp相似。每个子查询分别计算胜利和失败的次数,然后通过共享的col001列进行联接。 以上三种方法都能达到题目要求的结果,展示了SQL在处理数据统计和分组时的灵活性。在面试中,理解并能灵活运用这些技巧对于展示自己的SQL技能至关重要。同时,熟悉SQL Server 2005的特性和优化方法,例如索引、存储过程和事务管理,也是考察候选人能力的重要方面。