求助:编写SQL实现两列统计不同条目并在第三列求和
解决你的SQL统计需求
没问题,我来帮你调整这个SQL语句~你需要的是在同一条查询里完成两个条件的统计,再计算总和,同时加上日期过滤,用CASE WHEN配合聚合函数就能高效实现,避免重复扫描表。
下面是调整后的SQL语句:
SELECT -- 统计Conventional列:符合l16lcode=46且指定l46adr范围的ecarrno数量 COUNT(CASE WHEN l16lcode = 46 AND l46adr IN ('680','657','693','623','639','704','644','679') THEN ecarrno END) AS Conventional, -- 统计Auto列:符合admunit='16AP'且指定l46adr范围的条目数量 COUNT(CASE WHEN admunit = '16AP' AND l46adr IN ('611','618','637','638') THEN admunit END) AS Auto, -- 计算前两列的总和 (COUNT(CASE WHEN l16lcode = 46 AND l46adr IN ('680','657','693','623','639','704','644','679') THEN ecarrno END) + COUNT(CASE WHEN admunit = '16AP' AND l46adr IN ('611','618','637','638') THEN admunit END)) AS Total FROM L16T3 -- 应用日期范围过滤条件 WHERE DATREG >= @('START DATE',datreg);
细节补充说明:
- 如果
ecarrno存在重复值,想要统计唯一编号的数量,把COUNT(CASE...)改成COUNT(DISTINCT CASE...)即可。 - 对于
Auto列,因为已经限定admunit='16AP',用COUNT(CASE...)和COUNT(*)效果一致,但保留admunit更贴合你的需求描述。 - 日期条件
@('START DATE',datreg)我保留了你原有的写法,这应该是你使用的报表工具或数据库的参数语法,确保它能正确解析就行。
如果你的原始SQL是因为多次查询表、条件逻辑冲突导致问题,这个写法应该能完美解决你的需求~
内容的提问来源于stack exchange,提问作者Nixon
相关产品推荐
相关产品推荐

