2016-10-19 13 views
0

こんにちは私はこれの結果が必要です。エンティティIDが値と一致すると、特定の列の合計が必要になります。エラーが表示されません。誰かがエラーがどこにあるのかを教えてもらえますか?おかげさまで ゴードンで識別されるエイリアスの問題に加えてORACLE sum in case文

    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 
+3

「名前」とは異なる名前を使用してください。これはキーワードであり、コンパイラを混乱させる可能性があります。 –

答えて

2

と同様に@GordonLinoff(ASがキーワードであること)と@DCookieで言及した問題(あなたがグループごとにentityidが必要):

  • グループ化する場合は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 
    ); 
    

    あなたの拳2本のcase枝は計算が同じであるため、組み合わせることができますが、どちらの方法でも動作します:私はこれが何をしたいんだと思う

+0

アレックスありがとう!非常に良い説明とそれは働いた! – user5511576

+0

完全なクエリ(これはサブクエリでした)の後、case文を使用したときの方がうまく動作することがわかりました: – user5511576

+0

sum(ケース WHEN ufr.entityid = 'AHT' THEN MADAC.acdcalls + MADAC.daacdcalls WHEN ufr.entityid = 'ACW 'THEN MADAC.acdcalls + MADAC.daacdcalls いつufr.entityid ='遵守 'それからMAAC.totalSched いつufr.entityid ='適合 'その後MASC.MINUTES ELSE NULL 終了)ASの重み – user5511576

2

、私はあなたがあなたのCASE文のすべてのTHEN句で集計機能を使用する必要が見つけることだと思う、とあなたはufr.entityid、GROUP BYに必要であること同じように。そうしないと、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