按RAM分组求MAX(speed):含NULL则返回NULL的SQL实现问询
SQL分组查询需求与修正
需求
按ram字段分组,返回每组的MAX(speed);若某组的speed值中存在至少一个NULL,则该组对应的结果返回NULL。
原始数据
| ram | speed |
|---|---|
| 128 | 600 |
| 128 | 600 |
| 128 | 750 |
| 128 | 750 |
| 128 | 800 |
| 128 | 900 |
| 32 | 400 |
| 32 | NULL |
| 32 | 500 |
| 64 | 450 |
| 64 | 500 |
| 64 | 500 |
当前错误SQL
SELECT ram, CASE speed WHEN IS NOT NULL THEN MAX(speed) ELSE NULL END FROM Pc GROUP BY ram
错误点说明
- 语法错误:
CASE speed WHEN IS NOT NULL写法不符合SQL规范,NULL判断不能采用这种格式 - 逻辑错误:未检测分组内是否存在NULL值,且
speed作为非聚合字段,在GROUP BY仅包含ram的情况下直接使用会引发语法或逻辑问题
正确SQL写法
可以通过对比COUNT(speed)和COUNT(*)判断分组内是否存在NULL(COUNT(speed)会忽略NULL,COUNT(*)统计所有行,两者不等则说明组内有NULL):
SELECT ram, CASE WHEN COUNT(speed) = COUNT(*) THEN MAX(speed) ELSE NULL END AS m_speed FROM Pc GROUP BY ram
也可以用另一种方式检测NULL的存在:
SELECT ram, CASE WHEN MAX(CASE WHEN speed IS NULL THEN 1 ELSE 0 END) = 0 THEN MAX(speed) ELSE NULL END AS m_speed FROM Pc GROUP BY ram
最终结果
| ram | m_speed |
|---|---|
| 128 | 900 |
| 32 | NULL |
| 64 | 500 |
内容的提问来源于stack exchange,提问作者Igor
相关产品推荐
相关产品推荐

