Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle SQL条件和_Sql_Oracle_Group By_Sum_Aggregate - Fatal编程技术网

Oracle SQL条件和

Oracle SQL条件和,sql,oracle,group-by,sum,aggregate,Sql,Oracle,Group By,Sum,Aggregate,我有一个名称和数值表,我想按名称对值进行分组求和。这一部分很简单: SELECT name, SUM(my_value) "MyValue" FROM my_table GROUP BY name 但我的值中也有字符串“UNLIMITED”。当组中有“UNLIMITED”时,我只想选择值“UNLIMITED”,而不做任何求和。这是我使用UNION时想到的,但我知道有更好的方法: SELECT name, MAX("MyValue")

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

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
请检查真实的例子

示例表

NAME    MY_VALUE
name1   50
name1   20
name2   30
name2   UNLIMITED
所需结果示例

NAME    SUM("MYVALUE")
name1   70
name2   UNLIMITED

使用窗口函数执行此操作的一种方法

SELECT DISTINCT
    name,        
    CASE WHEN sum(case when my_value = 'UNLIMITED' then 1 else 0 end) over(partition by name) >= 1
    THEN 'UNLIMITED'
    ELSE cast(sum(case when my_value = 'UNLIMITED' then 0 else cast(my_value as number) end) over(partition by name)
              as varchar(255))
    end as myval
FROM my_table
这很有效

create  table tempxx (a nvarchar2(10), b nvarchar2(20))
insert into tempxx values ('a', 50);
insert into tempxx values ('a', 20);
insert into tempxx values ('b', 30);
insert into tempxx values ('b', 'UNLIMITED');


SELECT allt.a, decode(ut.max, NULL, to_char(allt.sum), to_char(ut.max)) as val
From
((SELECT
    a,
    sum(decode(b, 'UNLIMITED', 0, b)) sum
FROM tempxx 
Group by a) allT left join 
(SELECT
    a,
   Max(b) max
FROM tempxx 
WHERE  b = 'UNLIMITED'  
Group by a) ut on allt.a = ut.a)
A VAL
------------
b无限制
a 70


基本上,选择左侧的所有行,并仅使用unlimited进行连接。如果unlimited record为null,则保留左一条,否则获取unlimited data

这是表示逻辑的一种非常简单的方法:

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;
选择名称,
(最大值(my_值)=“无限”然后是“无限”时的情况)
ELSE TO_CHAR(总和(当我的_值“无限”时,则我的_值结束))
(完)
从我的桌子上
按名称分组;
这使用了字符在数字之后排序的事实

或类似逻辑:

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;
选择名称,
(COUNT(*)COUNT(NULLIF(my_值,'UNLIMITED'))时的大小写,然后是'UNLIMITED'
ELSE TO_CHAR(总和(NULLIF(我的_值,'UNLIMITED'))
(完)
从我的桌子上
按名称分组;

”或类似的不带CASE的逻辑:“您仍然使用
CASE END
,我想您的意思是不使用
MAX()
,这就是oracle professional和编写查询的开发人员之间的区别。有趣的是,凭直觉我知道我需要使用
来_char
max
:-)