SQL面试必备:CASE语句解决经典问题

需积分: 36 43 下载量 123 浏览量 更新于2024-12-14 收藏 47KB DOC 举报
"这篇资源是关于SQL面试题的解答,特别是涉及到如何使用CASE语句来处理数据统计的问题。主要目标是帮助面试者更好地理解和应用Oracle数据库优化技术。" 在SQL面试中,CASE语句是一个非常重要的工具,它允许我们在一个查询中进行条件判断并返回不同的值。在提供的面试题中,目标是统计每个日期(rq)对应的胜场(胜)和负场(负)的数量。以下是三种不同的解冔方案: 1) 第一种方法直接在同一个SELECT语句中使用CASE语句。通过SUM函数与CASE结合,当shengfu字段等于'胜'时,计数为1,否则为0。然后根据rq进行分组,这样可以分别得到每个日期的胜场和负场总数。 ```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将它们合并。每个子查询都根据rq分组并计算对应结果,之后通过ON子句连接相同rq的记录。 ```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 ``` 3) 第三种方法也是使用两个子查询,但这次是通过SELECT ... FROM ... AS ... 的方式创建临时表格A和B,分别代表胜场和负场的统计数据,然后再通过WHERE子句匹配col001(相当于rq)来组合结果。 ```sql SELECT a.col001, a.a1 AS '胜', b.b1 AS '负' 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 ``` 这些解冔方案都有效地解决了题目所提出的问题,展示了CASE语句在统计分析中的强大功能。在面试或实际工作中,理解并熟练运用这些技巧对于处理复杂的数据分析任务至关重要,尤其是在优化数据库性能方面。