db2 根据其他列的值选择总和

toe95027  于 2022-11-07  发布在  DB2
关注(0)|答案(2)|浏览(170)

我有一个表,其值为

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,则返回所有“CODE”在(5,6)中的量的总和。我们的想法是忽略除2、5和6之外的所有其他代码,将2作为求和的首选项。
我试过这个

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 Edit2中,QUANTITY列的值可以为0:小提琴

qvk1mo1f

qvk1mo1f1#

对于带有CODE = '2'的量的和,在CASE表达式中使用ELSE 0NULLIF(),因此即使和为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

tktrz96b

tktrz96b2#

如果基础表中的数量始终大于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

相关问题