根据其他列的值选择总和
Posted
技术标签:
【中文标题】根据其他列的值选择总和【英文标题】:Select sum based on value of other column 【发布时间】:2021-08-03 12:46:51 【问题描述】:我有一个表,其中包含类似的值
ID | CODE | QUANTITY
====================
1 | 2 | 20
2 | 2 | 40
3 | 5 | 10
4 | 6 | 15
5 | 5 | 20
6 | 6 | 50
7 | 6 | 10
8 | 7 | 20
9 | 8 | 100
我需要得到“CODE”= 2 的所有数量的总和。但是,如果总和为 0 然后返回 (5,6) 中“CODE”的所有数量的总和。这个想法是忽略除 2、5 和 6 之外的所有其他代码,将 2 作为 sum 的首选。
我试过了
WITH CTE AS(
SELECT
SUM(CASE WHEN CODE = '2' THEN QUANTITY ELSE 0 END) AS QUANTITY1,
SUM(CASE WHEN CODE IN ('5', '6') THEN QUANTITY ELSE 0 END) AS QUANTITY2
FROM TABLE1
)
SELECT CASE
WHEN QUANTITY1 <> 0 THEN QUANTITY1
ELSE QUANTITY2
END
FROM CTE
它确实有效,但我觉得它可以改进并且可以用最少的步骤完成。我该如何改进它?
Edit1:在 TABLE1 中 QUANTITY 列的值可以为 0 编辑2:sqlfiddle
【问题讨论】:
【参考方案1】:对于带有CODE = '2'
的数量的总和,在CASE
表达式和NULLIF()
中使用ELSE 0
,这样即使总和是0
,结果也是NULL
:
SELECT COALESCE(
NULLIF(SUM(CASE WHEN CODE = '2' THEN QUANTITY ELSE 0 END), 0),
SUM(CASE WHEN CODE IN ('5', '6') THEN QUANTITY END)
)
FROM TABLE1
您也可以使用ELSE
来表示CODE IN ('5', '6')
的数量:
SELECT COALESCE(
NULLIF(SUM(CASE WHEN CODE = '2' THEN QUANTITY ELSE 0 END), 0),
SUM(CASE WHEN CODE IN ('5', '6') THEN QUANTITY ELSE 0 END)
)
FROM TABLE1
请参阅demo。
【讨论】:
【参考方案2】:如果基础表中数量始终大于0
,则可以使用COALESCE()
:
SELECT COALESCE(SUM(CASE WHEN CODE = '2' THEN QUANTITY END) AS QUANTITY1,
SUM(CASE WHEN CODE IN ('5', '6') THEN QUANTITY END),
0) AS QUANTITY2
FROM TABLE1
【讨论】:
数量可以为 0。如果 CODE =2 的所有数量之和为 0,这似乎不起作用。 我想可以通过添加非零检查来解决。 sqlfiddle.com/#!9/08b697/1 @bluelurker 。 . .具体条件我不是很清楚。应该是数量总是大于零。使用像quantity
这样的名称似乎是一个合理的假设。以上是关于根据其他列的值选择总和的主要内容,如果未能解决你的问题,请参考以下文章
根据data.table中其他列中的计算值计算列中的滚动总和