2016-10-19 1 views
0

Привет Мне нужен результат этого. поэтому, если entityID соответствует значению, мне нужна сумма определенного столбца. Я получаю сообщение об ошибке. Может кто-нибудь указать мне, где ошибка? Спасибо.ORACLE сумма внутри сазе

    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 в группе-по):

  • вы также должны acdcalls и daacdcalls в группу по (если вы не можете агрегировать те);
  • вы не можете ссылаться на псевдоним столбца в том же уровне запроса, поэтому (weight * meets) AS weightedMeets не допускается - вы просто определить, что weight есть, в том же списке выбора. Вы должны использовать вложенный или КТР, если вы не хотите, чтобы повторить case логики.

Я думаю, что это делает то, что вы хотите:

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 ветви могут быть объединены, так как расчет такой же, но будет работать в любом случае.

+0

Спасибо, Алекс! очень приятное объяснение, и это сработало! – user5511576

+0

После завершения запроса (Это было подзапрос) я понял, что это работает лучше при использовании оператора выбора: – user5511576

+0

сумму (CASE КОГДА ufr.entityid = «АГТ» THEN MADAC.acdcalls + MADAC.daacdcalls КОГДА ufr.entityid = «ACW 'ТОГДА MADAC.acdcalls + MADAC.daacdcalls ПРИ ufr.entityid = 'Приверженность' ТОГДА MAAC.totalSched ПРИ ufr.entityid = '', то Conformance MASC.MINUTES ИНАЧЕ NULL КОНЕЦ ) как вес – user5511576

2

В дополнении к этому вопросу псевдонима идентифицированного Гордона, я думаю, вы обнаружите, вам нужно использовать агрегатную функцию во всех 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