SQL面试必备:经典题解析与CASE语句应用
需积分: 16 185 浏览量
更新于2024-10-26
收藏 47KB DOC 举报
"这篇资源是关于SQL面试题的解答,特别是涉及到使用CASE语句的情况。题目要求根据日期和胜负情况统计结果,给出三种不同的SQL解决方案。"
在SQL面试中,理解并熟练运用GROUP BY和CASE语句是非常重要的技能。GROUP BY用于对数据进行分组,而CASE语句则允许我们在SQL查询中实现条件判断,生成计算列或进行复杂的分类。以下是对给定面试题的解析和解答:
1. 第一个解决方案利用了CASE语句来计算每个日期的胜场和负场数量。首先,CASE语句会检查`shengfu`字段是否等于'胜',如果是,则返回1,否则返回0。然后,通过SUM函数对这些值进行求和,得到每个日期的胜场和负场总数。GROUP BY语句按日期`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. 第二种方法使用了子查询和JOIN操作。首先,分别创建两个子查询,一个计算胜场,一个计算负场,然后通过INNER JOIN将这两个结果集连接在一起,基于相同日期`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. 第三个解答也是通过子查询实现,但这里使用了别名`a`和`b`来表示胜利和失败的计数。每个子查询分别计算了`col002`为'胜'和'负'时,对应的`col001`的计数。然后通过WHERE子句连接这两个结果。
```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;
```
这三种方法虽然结构不同,但都能达到同样的效果,即统计每个日期的胜场和负场。在实际面试中,应根据数据库设计、性能需求和习惯选择合适的解决方案。熟悉这些技术对于SQL开发者来说至关重要,因为它们可以应用于各种数据汇总和分析场景。
2009-07-29 上传
2010-09-26 上传
2010-05-30 上传
2010-10-19 上传
2011-04-10 上传
2010-10-10 上传
2010-01-21 上传
2012-04-22 上传
2008-03-14 上传
gisinfo
- 粉丝: 86
- 资源: 9