使用CASE语句堆叠条件未返回会员全部病症的问题求助
Teradata多列布尔转单列(展示所有病症)
你的问题出在CASE语句的短路逻辑:它会按顺序判断条件,只要第一个满足的条件触发,就会返回对应结果,后面的条件不会再检查。所以即使会员同时患有多种病症,只会返回CASE里排在最前面的那个病症,去掉SELECT DISTINCT没用,因为单条记录里CASE本来就只会输出一个值。
下面给两种常用的解决方法:
方法1:拆分病症为多行记录
如果希望每个病症单独占一行,用UNION ALL分别提取每个符合条件的病症:
SELECT Member_ID, 'ASTHMA' AS DX_FLAG FROM your_table a WHERE a.ASTHMA_MBR = 1 UNION ALL SELECT Member_ID, 'COPD' AS DX_FLAG FROM your_table a WHERE a.COPD_MBR = 1 UNION ALL SELECT Member_ID, 'HYPERTENSION' AS DX_FLAG FROM your_table a WHERE a.HYPERTENSION_MBR = 1
这样有多个病症的会员会返回多条记录,每条对应一个病症。
方法2:合并所有病症到单个字符串
如果希望把同一会员的所有病症合并成一个字段(比如用逗号分隔),可以用Teradata的LISTAGG函数:
SELECT Member_ID, LISTAGG(DX_FLAG, ', ') WITHIN GROUP (ORDER BY DX_FLAG) AS DX_FLAGS FROM ( -- 先拆分每个病症为单独行 SELECT Member_ID, 'ASTHMA' AS DX_FLAG FROM your_table a WHERE a.ASTHMA_MBR = 1 UNION ALL SELECT Member_ID, 'COPD' AS DX_FLAG FROM your_table a WHERE a.COPD_MBR = 1 UNION ALL SELECT Member_ID, 'HYPERTENSION' AS DX_FLAG FROM your_table a WHERE a.HYPERTENSION_MBR = 1 ) t GROUP BY Member_ID
这个查询会把每个会员的所有病症按顺序拼接成一个字符串,比如同时有哮喘和高血压的会员,DX_FLAGS会显示ASTHMA, HYPERTENSION。
内容的提问来源于stack exchange,提问作者lauralee175
相关产品推荐
相关产品推荐

