基于Case语句隐藏行:报表多条件查询行重复问题求助
解决报表查询中m_is_req为null的客户重复行问题
嘿,这个问题我之前做报表的时候也碰到过!核心原因是当m_is_req IS NULL时,你的表中同一个客户大概率对应多条关联记录,直接查询就会返回多行重复数据。咱们可以用拆分场景+合并结果的思路精准解决:
方案一:用UNION ALL拆分两种场景处理
把m_is_req = '1'的正常数据,和m_is_req IS NULL的去重数据分开查询再合并,既能保留所有需要的有效行,又能避免null场景的重复:
-- 1. 处理m_is_req = '1'的客户,返回完整字段 SELECT c_id, cv_id, 用药日期 FROM 你的报表表名 WHERE m_is_req = '1' UNION ALL -- 2. 处理m_is_req为null的客户,确保每个客户仅一行 SELECT DISTINCT c_id, cv_id, NULL AS 用药日期 FROM 你的报表表名 WHERE m_is_req IS NULL
关键细节说明:
- 用
UNION ALL而非UNION,因为它不会对整个结果集去重,性能更优(咱们已经在第二个查询里用DISTINCT控制了重复) DISTINCT会自动去掉m_is_req IS NULL时同一个c_id+cv_id的重复行,保证每个客户只显示一次
方案二:如果cv_id存在多值,用聚合函数固定取值
如果同一个c_id在m_is_req IS NULL时对应多个不同的cv_id,而你只需要保留其中一个,可以用聚合函数(比如MAX/MIN)来指定取值规则:
SELECT c_id, MAX(cv_id) AS cv_id, NULL AS 用药日期 FROM 你的报表表名 WHERE m_is_req IS NULL GROUP BY c_id
这样会为每个c_id取最大的cv_id,同时强制仅返回一行数据。
验证小技巧
你可以先单独运行第二个查询,确认m_is_req IS NULL的客户是否只返回一行,再和第一个查询合并,就能得到完全符合需求的报表结果啦!
内容的提问来源于stack exchange,提问作者Jiah
相关产品推荐
相关产品推荐

