我有一个名称和数值表,我想对按名称分组的值求和。这部分很简单:
SELECT
name,
SUM(my_value) "MyValue"
FROM my_table
GROUP BY name
但是我的值也有字符串'UNLIMITED'。当组中有“ UNLIMITED”时,我只想选择值“ UNLIMITED”,而不做任何总和。这是我使用UNION想到的,但是我知道有更好的方法:
SELECT
name,
MAX("MyValue")
FROM (
SELECT
name,
'UNLIMITED' "MyValue"
FROM my_table
WHERE my_value = 'UNLIMITED'
GROUP BY name
UNION
SELECT
name,
TO_CHAR(SUM(
CASE WHEN my_value = 'UNLIMITED'
THEN '0'
ELSE my_value END
)) "MyValue"
FROM my_table
GROUP BY name
) t
GROUP BY name
请查看SqlFiddle作为真实示例。
示例表
NAME MY_VALUE
name1 50
name1 20
name2 30
name2 UNLIMITED
想要的结果示例
NAME SUM("MYVALUE")
name1 70
name2 UNLIMITED
最佳答案
这是表达逻辑的一种非常简单的方法:
SELECT name,
(CASE WHEN MAX(my_value) = 'UNLIMITED' THEN 'UNLIMITED'
ELSE TO_CHAR(SUM(CASE WHEN my_value <> 'UNLIMITED' THEN my_value END))
END)
FROM my_table
GROUP BY name;
这利用了字符在数字之后排序的事实。
或类似的逻辑:
SELECT name,
(CASE WHEN COUNT(*) <> COUNT(NULLIF(my_value, 'UNLIMITED')) THEN 'UNLIMITED'
ELSE TO_CHAR(SUM(NULLIF(my_value, 'UNLIMITED')))
END)
FROM my_table
GROUP BY name;