Select 根据其他列的值求和

Select sum based on value of other column

我有一个 table,其值类似于

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 然后 return (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

如果标的table的数量总是大于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

对于 CODE = '2' 的数量总和,在 CASE 表达式和 NULLIF() 中使用 ELSE 0,这样结果是 NULL,即使总和是 0:

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