SQL中如何透视多行相似值为未知列且不丢失数据?
问题:透视指定列/表时如何避免丢失数据
背景与原有实现
我之前通过聚合函数MAX结合GROUP BY实现了按ID将多个CASE WHEN表达式的结果合并为单行,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
遇到的问题
现在发现一个问题:CASE WHEN中的判定条件(比如'foo')可能对应多行数据,每行的感兴趣列值各不相同,使用MAX/MIN这类聚合函数会丢失有用数据,而且我无法提前知晓每个判定条件对应的行数。
示例数据
| IDvar_foreign_key | criteria_col | col_of_interest1 | col_of_interest2 |
|---|---|---|---|
| x1 | foo | 01-01-2021 | 100 |
| x1 | foo | 01-06-2021 | 2000 |
| x1 | foo | 01-08-2021 | 0 |
| x1 | bar | 01-08-2021 | 300 |
注:实际表包含唯一标识符/主键。
期望输出
| IDvar_foreign_key | foo_1_col_of_interest1 | foo_1_col_of_interest2 | foo_2_col_of_interest1 | foo_2_col_of_interest2 | foo_3_col_of_interest1 | foo_3_col_of_interest2 |
|---|---|---|---|---|---|---|
| x1 | 01-01-2021 | 100 | 01-06-2021 | 2000 | 01-08-2021 | 0 |
补充思考
有人建议使用动态查询来解决这个问题,我也在考虑是否可以不依赖聚合函数实现这类透视,相关思路包括动态透视、无聚合的行转列实现等。
内容的提问来源于stack exchange,提问作者Johan
相关产品推荐
相关产品推荐

