根据其他列的值选择总和

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 这样的名称似乎是一个合理的假设。

以上是关于根据其他列的值选择总和的主要内容,如果未能解决你的问题,请参考以下文章

根据表中其他列的值从同一表中的 2 列中选择信息

根据table2选择table1中列的总和? [复制]

根据data.table中其他列中的计算值计算列中的滚动总和

需要 SQL 来选择行,直到列的总和达到最后一行不会完全消耗值的值

根据其他列熊猫求和并保存列的值[重复]

根据其他两列的值在 Pandas 中创建一个新列[重复]