SQL查询求助:合并多行列数据并按组织统计约束次数
解决DAILY_LOG_CUSTOM_DATA的组织约束次数统计问题
我懂你现在的纠结——这个表把同一条记录的不同字段拆成了多行,跨行列关联统计确实容易踩坑。先帮你拆解原查询的问题,再给出可行的解决办法:
原查询的问题根源
你的原语句里,WHERE Field_Name = 'Restraint?' AND Recoded_Response = 1已经把所有Organization相关的行过滤掉了,所以后面的CASE WHEN Field_Name = 'Organization'永远不会触发,统计结果自然不对;另外GROUP BY DLSEQUENCE会返回每个序列的单独统计(而非整体总数),这也和你要的汇总结果不符。
解决方案1:用CTE聚合同一序列的信息
先把每个DLSEQUENCE对应的组织和约束状态整合到同一行,再统计总数:
WITH SequenceSummary AS ( SELECT DLSEQUENCE, -- 提取当前序列对应的组织名称 MAX(CASE WHEN Field_Name = 'Organization' THEN Recoded_Response END) AS Organization, -- 判断当前序列是否存在约束(1代表Yes) MAX(CASE WHEN Field_Name = 'Restraint?' THEN Recoded_Response END) AS HasRestraint FROM DAILY_LOG_CUSTOM_DATA -- 只保留需要的两类字段,提升查询效率 WHERE Field_Name IN ('Organization', 'Restraint?') GROUP BY DLSEQUENCE -- 只筛选出有约束的序列 HAVING MAX(CASE WHEN Field_Name = 'Restraint?' THEN Recoded_Response END) = 1 ) SELECT -- 统计ABC组织的约束次数 COUNT(CASE WHEN Organization = 'ABC' THEN 1 END) AS ABC, -- 统计DEF组织的约束次数 COUNT(CASE WHEN Organization = 'DEF' THEN 1 END) AS DEF FROM SequenceSummary;
解决方案2:用自连接关联数据
把约束记录和对应的组织记录通过DLSEQUENCE关联,直接统计符合条件的行数:
SELECT COUNT(CASE WHEN org.Recoded_Response = 'ABC' THEN 1 END) AS ABC, COUNT(CASE WHEN org.Recoded_Response = 'DEF' THEN 1 END) AS DEF FROM DAILY_LOG_CUSTOM_DATA restraint -- 关联同一序列下的组织信息 JOIN DAILY_LOG_CUSTOM_DATA org ON restraint.DLSEQUENCE = org.DLSEQUENCE WHERE -- 筛选有约束的记录 restraint.Field_Name = 'Restraint?' AND restraint.Recoded_Response = 1 -- 关联对应的组织字段 AND org.Field_Name = 'Organization';
这两种方法都能得到你想要的结果:以ABC、DEF为列,显示各自的约束总数。如果后续要增加其他组织,只需要在CASE语句里添加对应的判断即可。
内容的提问来源于stack exchange,提问作者HopDevvil814
相关产品推荐
相关产品推荐

