Oracle SQL条件求和

浪费

我有一个名称和数值表,我想对按名称分组的值求和。这部分很简单:

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;

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章