簡體   English   中英

案例陳述中的ORACLE總和

[英]ORACLE sum inside a case statement

嗨,我需要這個結果。 所以如果一個entityID匹配一個值,我需要某些列的總和。我得到一個表達式缺失錯誤。 有人可以指出我的錯誤所在嗎? 謝謝。

                   SELECT                               
                            p.jobTitle,
                            p.department,
                            p.person,
                            ufr.meets,
                            ufr.exceeds,
                            CASE 
                                 WHEN ufr.entityid = 'AHT' THEN (AD.acdcalls + AD.daacdcalls) 
                                 WHEN ufr.entityid = 'ACW' THEN (AD.acdcalls + AD.daacdcalls) 
                                 WHEN ufr.entityid = 'Adherence' THEN SUM(AA.totalSched)
                                 WHEN ufr.entityid = 'Conformance' THEN SUM(AS.minutes)
                                 ELSE null
                            END as weight,
                            (weight * meets) AS weightedMeets,
                            (weight * exceeds) AS weightedExceeds

                    FROM  M_PERSON p
                    JOIN A_TMP5408_UNFLTRDRESULTSAG ufr
                            ON ufr.department = p.department AND ufr.jobTitle = p.jobTitle 
                    LEFT JOIN M_AvayaDAgentChunk AD 
                            ON AD.person = p.person and ufr.split = AD.split    
                    LEFT JOIN M_AgentAdherenceChunk AA 
                            ON AA.person = p.person 
                    LEFT JOIN M_AgentScheduleChunk AS 
                            ON AS.person = p.person 

                    GROUP BY
                            p.person,
                            p.department,
                            p.jobTitle,
                            ufr.meets,
                            ufr.exceeds,
                            weight,
                            weightedMeets,
                            weightedExceeds

除了Gordon標識的別名問題之外,我想您會發現您需要在CASE語句的所有THEN子句中使用聚合函數,並且還需要對GROUP BY ufr.entityid進行操作。 否則,您將開始收到ora-00979錯誤(不是GROUP BY表達式)。 如果您不想在所有子句中使用聚合函數,則還必須對要求和的表達式進行分組。

小插圖:

CREATE TABLE tt (ID varchar2(32), sub_id varchar2(32), x NUMBER, y NUMBER);
INSERT INTO tt VALUES ('ID1', 'A', 1, 6);
INSERT INTO tt VALUES ('ID1', 'B', 1, 7);
INSERT INTO tt VALUES ('ID2', 'A', 2, 6);
INSERT INTO tt VALUES ('ID2', 'B', 2, 7);
INSERT INTO tt VALUES ('ID3', 'A', 3, 6);
INSERT INTO tt VALUES ('ID3', 'B', 3, 7);
INSERT INTO tt VALUES ('ID3', 'C', 3, 8);

SELECT ID, CASE WHEN sub_id = 'A' THEN SUM(y)
                WHEN sub_id = 'B' THEN SUM(x)
                ELSE (x + y) END tst
  FROM tt
 GROUP BY ID

ORA-00979: not a GROUP BY expression  (points at sub_id in WHEN)

SELECT ID, CASE WHEN sub_id = 'A' THEN SUM(y)
                WHEN sub_id = 'B' THEN SUM(x)
                ELSE (x + y) END tst
  FROM tt
 GROUP BY ID, sub_id

ORA-00979: not a GROUP BY expression    (points at x in ELSE)

SQL> SELECT ID, CASE WHEN sub_id = 'A' THEN SUM(y)
  2                  WHEN sub_id = 'B' THEN SUM(x)
  3                  ELSE SUM(x + y) END tst
  4    FROM tt
  5   GROUP BY ID, sub_id;

ID                                      TST
-------------------------------- ----------
ID1                                       6
ID3                                       6
ID3                                       3
ID1                                       1
ID2                                       6
ID2                                       2
ID3                                      11

以及由@GordonLinoff提到的問題(即AS是一個關鍵字)和@DCookie(你需要entityid組,通過):

  • 您還需要acdcalls daacdcalls進行acdcallsdaacdcalls (除非您可以匯總它們);
  • 您不能在同一級別的查詢中引用列別名,因此(weight * meets) AS weightedMeets是不允許的-您只需在同一選擇列表中定義weight 如果您不想重復case邏輯,則需要使用內聯視圖或CTE。

我認為這可以滿足您的需求:

SELECT
        jobTitle,
        department,
        person,
        meets,
        exceeds,
        weight,  
        (weight * meets) AS weightedMeets,
        (weight * exceeds) AS weightedExceeds
FROM
(
        SELECT                               
                MP.jobTitle,
                MP.department,
                MP.person,
                ufr.meets,
                ufr.exceeds,
                CASE 
                     WHEN ufr.entityid = 'AHT' THEN (MADAC.acdcalls + MADAC.daacdcalls) 
                     WHEN ufr.entityid = 'ACW' THEN (MADAC.acdcalls + MADAC.daacdcalls) 
                     WHEN ufr.entityid = 'Adherence' THEN SUM(MAAC.totalSched)
                     WHEN ufr.entityid = 'Conformance' THEN SUM(MASC.minutes)
                     ELSE null
                END as weight
        FROM  M_PERSON MP
        JOIN A_TMP5408_UNFLTRDRESULTSAG ufr
                ON ufr.department = MP.department AND ufr.jobTitle = MP.jobTitle 
        LEFT JOIN M_AvayaDAgentChunk MADAC 
                ON MADAC.person = MP.person and ufr.split = MADAC.split    
        LEFT JOIN M_AgentAdherenceChunk MAAC
                ON MAAC.person = MP.person 
        LEFT JOIN M_AgentScheduleChunk MASC
                ON MASC.person = MP.person 
        GROUP BY
                MP.person,
                MP.department,
                MP.jobTitle,
                ufr.meets,
                ufr.exceeds,
                ufr.entityid,
                MADAC.acdcalls,
                MADAC.daacdcalls
);

您的第一個case分支可以合並,因為計算方法相同,但是無論哪種方式都可以工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM