我有一个表,其值为
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:小提琴
2条答案
按热度按时间qvk1mo1f1#
对于带有
CODE = '2'
的量的和,在CASE
表达式中使用ELSE 0
和NULLIF()
,因此即使和为0
,结果也为NULL
:您也可以将
ELSE
用于具有CODE IN ('5', '6')
的数量:请参阅demo。
tktrz96b2#
如果基础表中的数量始终大于
0
,则可以使用COALESCE()
: