Агрегация, групповая ошибка даже при использовании OVER PARTITION BY - PullRequest
0 голосов
/ 03 июля 2019

Я получаю эту ошибку

'PRINTING_DATE' недопустим в списке выбора, поскольку он не содержится ни в статистической функции, ни в предложении GROUP BY

но с помощью OVER PARTITION BY я ожидал, что эти проблемы не появятся, почему я все еще получаю эту ошибку?

DECLARE @REPORT AS NVARCHAR(50) = '2019-06-19 00:00:00.000'

SELECT 
    SUM(CASE 
           WHEN (P_DATE < @REPORT AND P_DATE > DATEADD(DAY, -7, @REPORT)) 
              THEN QTY_PICKED 
              ELSE 0 
        END) OVER (PARTITION BY PLANT, PARTS, P_DATE) AS SHIPPED,
    SUM(CASE 
           WHEN E_DATE > @REPORT AND E_DATE < DATEADD(DAY, 7, @REPORT) 
              THEN QTY_MII 
              ELSE 0 
        END) - SUM(CASE 
                      WHEN E_DATE > @REPORT AND E_DATE < DATEADD(DAY, 7, @REPORT) 
                         THEN QTY_PICKED 
                         ELSE 0 
                   END) AS TO_SHIP
FROM
    TABLE1 T1
INNER JOIN
    TABLE2 T2 ON T1.DELIVERY = T2.DELIVERY
WHERE 
    PLANT = 'XXX'

Ответы [ 2 ]

0 голосов
/ 03 июля 2019

Довольно непонятно, что вы пытаетесь сделать.Но я могу дать подсказку: оконные функции бесполезны, если ваш результирующий набор представляет собой агрегат, который возвращает одну строку.

Итак, вы можете захотеть это:

SELECT SUM(CASE WHEN (P_DATE < @REPORT AND P_DATE > DATEADD(DAY, -7, @REPORT)) 
                THEN QTY_PICKED 
                ELSE 0 
           END) AS SHIPPED,
          (SUM(CASE WHEN E_DATE > @REPORT AND E_DATE < DATEADD(DAY, 7, @REPORT) 
                   THEN QTY_MII 
                   ELSE 0 
               END) -
           SUM(CASE WHEN E_DATE > @REPORT AND E_DATE < DATEADD(DAY, 7, @REPORT) 
                    THEN QTY_PICKED 
                    ELSE 0 
               END)
          ) AS TO_SHIP
FROM TABLE1 T1 INNER JOIN
     TABLE2 T2
     ON T1.DELIVERY = T2.DELIVERY
WHERE PLANT = 'XXX';

Конечноможет потребоваться запрос агрегации, который возвращает более одной строки:

SELECT PLANT, PARTS, P_DATE,
       SUM(CASE WHEN (P_DATE < @REPORT AND P_DATE > DATEADD(DAY, -7, @REPORT)) 
                THEN QTY_PICKED 
                ELSE 0 
           END) AS SHIPPED,
          (SUM(CASE WHEN E_DATE > @REPORT AND E_DATE < DATEADD(DAY, 7, @REPORT) 
                   THEN QTY_MII 
                   ELSE 0 
               END) -
           SUM(CASE WHEN E_DATE > @REPORT AND E_DATE < DATEADD(DAY, 7, @REPORT) 
                    THEN QTY_PICKED 
                    ELSE 0 
               END)
          ) AS TO_SHIP
FROM TABLE1 T1 INNER JOIN
     TABLE2 T2
     ON T1.DELIVERY = T2.DELIVERY
WHERE PLANT = 'XXX'
GROUP BY PLANT, PARTS, P_DATE;
0 голосов
/ 03 июля 2019

Как указала HoneyBadger, у вас есть только «OVER PARTITION BY» в первом СУММЕ, а не во втором.

Попробуйте это как упрощенную версию:

DECLARE @T1 TABLE(PLANT INT,PARTS INT,P_DATE DATE,QTY1 INT, QTY2 INT)
INSERT INTO @T1 VALUES(1,1,'2019-07-03',40,60)
INSERT INTO @T1 VALUES(1,1,'2019-07-03',50,80)

SELECT 
     SUM(QTY1) OVER (PARTITION BY PLANT, PARTS, P_DATE) AS SHIPPED
    ,SUM(QTY1) OVER (PARTITION BY PLANT, PARTS, P_DATE) - 
      SUM(QTY2) OVER (PARTITION BY PLANT, PARTS, P_DATE) AS TOSHIP
    ,SUM(QTY1)  -  SUM(QTY2) AS TOSHIP2
FROM  @T1
WHERE PLANT = 1

Это будетвызвать ошибку: столбец '@ T1.PLANT' недопустим в списке выбора, поскольку он не содержится ни в статистической функции, ни в предложении GROUP BY.Если вы прокомментируете / удалите строку

,SUM(QTY1)  -  SUM(QTY2) AS TOSHIP2

, это даст результат.Кстати: в этом примере ошибка также указывает на первый СУММ, но это не проблема.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...