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。
我有一个 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。