Oracle SQL - «Не группа по выражению» после добавления операторов CASE - PullRequest
0 голосов
/ 02 ноября 2018

У меня длинный запрос, к которому мне пришлось добавить два новых оператора CASE -

SELECT nt.COSTCENTER,
s.DAD,
s.DIVISION, 
nt.DISPENSER,
UPPER(nt.TINTERSERIALNBR),
COUNT(*)OVER (PARTITION BY nt.COSTCENTER) AS NumOfDispensers,
nt.CLRNTSYS,
SUM(CASE WHEN
(nt.CLRNTSYS ='CCE' AND (nt.BOOKDATE >= '01-JAN-17' AND nt.BOOKDATE <= '31-DEC-17')) 
THEN nt.GALLONS ELSE 0 END) AS CCEGallons2017,
SUM(CASE WHEN
(nt.CLRNTSYS ='BAC' AND (nt.BOOKDATE >= '01-JAN-17' AND nt.BOOKDATE <= '31-DEC-17'))
THEN nt.GALLONS ELSE 0 END) AS BACGallons2017,
SUM(CASE WHEN
(nt.CLRNTSYS ='CCE' AND (nt.BOOKDATE >= '01-JAN-18' AND nt.BOOKDATE <= '31-DEC-18')) 
THEN nt.GALLONS ELSE 0 END) AS CCEGallons2018,
SUM(CASE WHEN
(nt.CLRNTSYS ='BAC' AND (nt.BOOKDATE >= '01-JAN-18' AND nt.BOOKDATE <= '31-DEC-18'))
THEN nt.GALLONS ELSE 0 END) AS BACGallons2018,
CASE WHEN to_char(tm.DNRDATE,'YYYY') = '2017' THEN 'YES' ELSE 'NO' END DNR2017,
CASE WHEN to_char(tm.DNRDATE,'YYYY') = '2018' THEN 'YES' ELSE 'NO' END DNR2018
FROM MQ_CDS_NETTRAN nt
INNER JOIN MQCCNSTORE s
ON nt.COSTCENTER = s.COSTCENTER
INNER JOIN TINTER_MASTER tm
ON UPPER(nt.TINTERSERIALNBR) = UPPER(tm.SERIALNBR)
WHERE nt.BOOKDATE >= '01-JAN-17'
AND nt.CLRNTSYS IN ('CCE','BAC')
AND nt.TRANCODE = 'DISP'
AND UPPER(nt.DISPENSER) <> 'BYHAND'
AND UPPER(nt.DISPENSER) <> 'STANDALONE'
AND tm.DECOMMDATE IS NULL
GROUP BY nt.COSTCENTER, nt.DISPENSER, UPPER(nt.TINTERSERIALNBR), nt.CLRNTSYS,
s.DAD, s.DIVISION
ORDER BY nt.COSTCENTER, nt.DISPENSER, UPPER(nt.TINTERSERIALNBR), nt.CLRNTSYS;

Это две строки CASE, которые я добавил в запрос:

CASE WHEN to_char(tm.DNRDATE,'YYYY') = '2017' THEN 'YES' ELSE 'NO' END DNR2017,
CASE WHEN to_char(tm.DNRDATE,'YYYY') = '2018' THEN 'YES' ELSE 'NO' END DNR2018

И когда я пытаюсь выполнить запрос, я получаю «Не группа по выражению». До добавления этих двух строк запрос выполнялся просто отлично. Как лучше всего это исправить?

1 Ответ

0 голосов
/ 02 ноября 2018

Вам нужно разрешить CASE WHEN добавить group by, потому что CASE WHEN не является агрегатной функцией.

SELECT nt.COSTCENTER,
    s.DAD,
    s.DIVISION, 
    nt.DISPENSER,
    UPPER(nt.TINTERSERIALNBR),
    COUNT(*)OVER (PARTITION BY nt.COSTCENTER) AS NumOfDispensers,
    nt.CLRNTSYS,
    SUM(CASE WHEN
    (nt.CLRNTSYS ='CCE' AND (nt.BOOKDATE >= '01-JAN-17' AND nt.BOOKDATE <= '31-DEC-17')) 
    THEN nt.GALLONS ELSE 0 END) AS CCEGallons2017,
    SUM(CASE WHEN
    (nt.CLRNTSYS ='BAC' AND (nt.BOOKDATE >= '01-JAN-17' AND nt.BOOKDATE <= '31-DEC-17'))
    THEN nt.GALLONS ELSE 0 END) AS BACGallons2017,
    SUM(CASE WHEN
    (nt.CLRNTSYS ='CCE' AND (nt.BOOKDATE >= '01-JAN-18' AND nt.BOOKDATE <= '31-DEC-18')) 
    THEN nt.GALLONS ELSE 0 END) AS CCEGallons2018,
    SUM(CASE WHEN
    (nt.CLRNTSYS ='BAC' AND (nt.BOOKDATE >= '01-JAN-18' AND nt.BOOKDATE <= '31-DEC-18'))
    THEN nt.GALLONS ELSE 0 END) AS BACGallons2018,
    CASE WHEN to_char(tm.DNRDATE,'YYYY') = '2017' THEN 'YES' ELSE 'NO' END DNR2017,
    CASE WHEN to_char(tm.DNRDATE,'YYYY') = '2018' THEN 'YES' ELSE 'NO' END DNR2018
FROM MQ_CDS_NETTRAN nt
INNER JOIN MQCCNSTORE s ON nt.COSTCENTER = s.COSTCENTER
INNER JOIN TINTER_MASTER tm ON UPPER(nt.TINTERSERIALNBR) = UPPER(tm.SERIALNBR)
WHERE 
        nt.BOOKDATE >= '01-JAN-17'
    AND nt.CLRNTSYS IN ('CCE','BAC')
    AND nt.TRANCODE = 'DISP'
    AND UPPER(nt.DISPENSER) <> 'BYHAND'
    AND UPPER(nt.DISPENSER) <> 'STANDALONE'
    AND tm.DECOMMDATE IS NULL
GROUP BY 
    nt.COSTCENTER, 
    nt.DISPENSER, 
    UPPER(nt.TINTERSERIALNBR),
    nt.CLRNTSYS,
    s.DAD, 
    s.DIVISION,
    CASE WHEN to_char(tm.DNRDATE,'YYYY') = '2017' THEN 'YES' ELSE 'NO' END,
    CASE WHEN to_char(tm.DNRDATE,'YYYY') = '2018' THEN 'YES' ELSE 'NO' END
ORDER BY nt.COSTCENTER, nt.DISPENSER, UPPER(nt.TINTERSERIALNBR), nt.CLRNTSYS;
...