使用CASE语句进行数据透视时如何避免生成重复行?
问题解决方法
错误原因
你当前的写法使用DISTINCT是对查询返回的整行数据做去重,原始表中同一个ID对应多条购买记录时,每条记录生成的查询行的item_1/item_2/item_3字段的Y/N组合各不相同,DISTINCT无法把这些行合并,自然会出现同一个ID多行的情况。
通用解决写法
改用GROUP BY按ID分组,搭配聚合函数实现行转列,兼容绝大多数SQL数据库,参考代码如下:
select id, max(case when purchased_item = 'Item 1' then 'Y' else 'N' end) item_1, max(case when purchased_item = 'Item 2' then 'Y' else 'N' end) item_2, max(case when purchased_item = 'Item 3' then 'Y' else 'N' end) item_3 from my_table group by id
实现原理
- 按
id分组后,同一个ID的所有原始记录会被聚合为一行 MAX函数作用于每个CASE语句的返回结果:如果该ID买过对应商品,CASE会返回至少一个Y,MAX就会取Y作为该字段的结果;如果从未购买对应商品,所有CASE都返回N,最终结果就是N,刚好符合数据透视的需求。
内容的提问来源于stack exchange,提问作者JB999
相关产品推荐
相关产品推荐

