如何将多CASE WHEN表达式的查询结果按ID合并为单行?
问题
为实现多条件SELECT查询结果合并,我使用了以下SQL语句:
SELECT table1.IDvar, (CASE WHEN table2.var1 = 'foo' THEN table2.var2 END) AS condition1, (CASE WHEN table2.var1 = 'bar' THEN table2.var2 END) AS condition2 FROM table1 FULL JOIN table2 ON table1.IDvar = table2.table1_IDvar
但该语句返回的结果中每个ID对应多行数据,而非将各条件结果列置于同一行,示例结果如下:
| IDvar | condition1 | condition2 |
|---|---|---|
| x1 | 2 | (null) |
| x1 | (null) | (null) |
| x1 | (null) | 33 |
| h2 | 1000 | (null) |
| h2 | (null) | (null) |
| h2 | (null) | (null) |
| z3 | (null) | 0 |
| z3 | 300 | (null) |
| z3 | (null) | (null) |
注:每个ID对应的行数并不相等。
需要将不同CASE WHEN表达式的查询结果按唯一ID合并到同一行,得到如下格式的输出:
| IDvar | condition1 | condition2 |
|---|---|---|
| x1 | 2 | 33 |
| h2 | 1000 | (null) |
| z3 | 300 | 0 |
解决方案
要实现按ID合并行,需要用聚合函数配合CASE WHEN,再通过GROUP BY按ID分组。聚合函数(如MAX)会忽略NULL值,提取每个ID下对应条件的有效数据,最终将同一ID的多行合并为一行。
修改后的SQL语句如下:
SELECT table1.IDvar, MAX(CASE WHEN table2.var1 = 'foo' THEN table2.var2 END) AS condition1, MAX(CASE WHEN table2.var1 = 'bar' THEN table2.var2 END) AS condition2 FROM table1 FULL JOIN table2 ON table1.IDvar = table2.table1_IDvar GROUP BY table1.IDvar
说明
MAX()函数:针对每个ID,取CASE WHEN结果中的非NULL值,因为同一ID下每个条件只会有一个有效非NULL值(或全为NULL),MAX能精准提取该值。GROUP BY table1.IDvar:将所有同一ID的行分组,确保每个ID只返回一行结果。
内容的提问来源于stack exchange,提问作者Johan
相关产品推荐
相关产品推荐

