SQL Server下数据集多条件过滤分组后对avail列求和如何实现
原写法错误说明
你提交的SQL存在几个明显的语法和逻辑问题:
- SQL不支持直接用
+拼接两个WHERE条件块 - 单条查询仅能出现1个WHERE关键字,多个筛选条件用AND/OR拼接即可
- SQL Server中等值判断用
=,不是== - SELECT中出现的非聚合字段
date必须包含在GROUP BY子句中
正确实现方案
需求本质是life为keep的记录avail值计算2次,life为stay的记录avail值计算1次,有两种常用实现方式:
方案1:UNION ALL合并两次查询(逻辑最直观,和你描述的需求完全对应)
SELECT name, date, SUM(avail) AS sum_avail FROM ( -- 第一部分筛选结果 SELECT name, date, avail FROM 你的表名 WHERE date = '9/1/2021' AND stack != 'unused' AND life IN ('keep','stay') UNION ALL -- 第二部分筛选结果叠加 SELECT name, date, avail FROM 你的表名 WHERE date = '9/1/2021' AND stack != 'unused' AND life = 'keep' ) t GROUP BY name, date
方案2:单表扫描加权计算(性能更高,仅需扫描一次表)
SELECT name, date, SUM(avail * CASE WHEN life = 'keep' THEN 2 WHEN life = 'stay' THEN 1 ELSE 0 END) AS sum_avail FROM 你的表名 WHERE date = '9/1/2021' AND stack != 'unused' AND life IN ('keep','stay') GROUP BY name, date
两种写法执行后都可以得到你预期的输出结果。
内容的提问来源于stack exchange,提问作者Lynn
相关产品推荐
相关产品推荐

