SQL面试题:按日期统计胜负结果

4星 · 超过85%的资源 需积分: 33 4 下载量 67 浏览量 更新于2024-09-12 收藏 50KB DOC 举报
在SQL面试中,面试官经常提问关于基础操作和复杂查询的问题来考察应聘者的技能水平。以下两个例子展示了不同场景下的SQL语句应用。 第一个问题是关于使用`GROUP BY`和条件计算。题目中给出的表`#tmp`记录了比赛日期(rq)和结果(shengfu)。应聘者被要求统计每个日期的胜场('胜')和负场('负')次数。有三种不同的解决方案: 1. 第一种方法是使用`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; ``` 这个查询通过分别计算每个日期中'胜'和'负'的结果数量,然后对结果进行求和,得到每个日期的胜负次数。 2. 第二种方法是利用嵌套的`SELECT`和`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; ``` 这里先分别计算出胜场和负场的数量,然后通过内连接确保只有在日期相同的行之间进行匹配。 3. 第三个方法也是基于计数,但使用了两次子查询,一个计算'胜',另一个计算'负',然后通过相同的日期关联结果: ``` 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; ``` 这里同样实现了按日期计数,然后通过日期相等的条件将胜场和负场的结果合并。 第二个问题是关于一个更复杂的查询,表中有A、B、C三列,要求实现的SQL语句在A列特定条件下筛选数据。具体问题没有完全给出,但可以假设需要根据A列的某些值(如特定值或满足特定条件的值)来过滤B和C列的数据。可能的SQL结构可能是: ``` SELECT * FROM table_name WHERE A = '特定值' AND (B = '期望B值' OR C = '期望C值'); ``` 或者,如果需要基于A列的条件进行复杂的逻辑操作,可以使用`CASE`或`HAVING`子句,例如: ``` SELECT * FROM table_name WHERE A IN ('值1', '值2') GROUP BY A HAVING COUNT(*) > 1; ``` 这会筛选出A列中有多个相同值的行。 在SQL面试中,面试官会关注应聘者对基础语法的掌握、复杂查询的设计能力以及对数据处理逻辑的理解。理解并能够灵活运用这些基础和高级查询技巧对于求职者来说至关重要。