Сообщение 102, Уровень 15, Состояние 1, Строка 28 Неверный синтаксис рядом с 'order' - PullRequest
0 голосов
/ 21 марта 2019

Я пытаюсь выполнить следующий запрос и получаю сообщение об ошибке. Я пытаюсь рассчитать YTD и Previous YTD в одном запросе.

Сообщение 102, Уровень 15, Состояние 1, Строка 28 Неверный синтаксис рядом с 'order'.

WITH
    grouped_by_date AS
(
    SELECT
        [Sales_Organization],
        [Market_Grp],
        [Delivery_Year],
        [Delivery_Month],
        [Invoicing_Day],
        SUM(QTY_UoM)             AS Weight
    FROM
        tmp.factsales s
    GROUP BY
        [Sales_Organization],
        [Market_Grp],
        [Delivery_Year],
        [Delivery_Month],
        [Invoicing_Day]
),
    cumulative_sum_for_ytd AS
(
    SELECT
        *,


        SUM([Weight]) OVER (PARTITION BY [Delivery_Year] ORDER BY [Delivery_Month], [Invoicing_Day]
                           )
                              AS Weight_YTD
    FROM
        grouped_by_date
),


    hack_to_do_lag AS
(
    SELECT
        *,
        CASE
            WHEN [Delivery_Year]%2=1
            THEN MAX(CASE WHEN [Delivery_Year]%2=0 THEN [Weight_YTD] END) OVER (PARTITION BY ([Delivery_Year]+0)/2)
            ELSE MAX(CASE WHEN [Delivery_Year]%2=1 THEN [Weight_YTD] END) OVER (PARTITION BY ([Delivery_Year]+1)/2)
        END
            AS Weight_PreviousYTD
    FROM
        cumulative_sum_for_ytd
)
SELECT
    *
FROM
    hack_to_do_lag

Я искал в Google, кажется, проблема с ссылкой на версию, которую я использовал, на самом деле:

SELECT @@VERSION

Microsoft SQL Server 2008 R2 (SP3) - 10.50.6220.0 (X64) 19 марта 2015 г. 12:32:14 Авторское право (c) Microsoft Corporation Enterprise Edition (64-разрядная версия) в Windows NT 6.3 (сборка 9600:) (гипервизор)

Как я мог решить мою проблему? Я не могу изменить версию.

1 Ответ

0 голосов
/ 21 марта 2019

SQL Server 2008 не поддерживает кумулятивные оконные функции, поэтому вам нужно выполнять вычисления по-другому.Подзапрос или apply является типичным методом:

WITH grouped_by_date AS (
      SELECT Sales_Organization, Market_Grp,
             Delivery_Year, Delivery_Month, Invoicing_Day,
             SUM(QTY_UoM) as Weight
      FROM tmp.factsales s
      GROUP BY Sales_Organization, Market_Grp,
               Delivery_Year, Delivery_Month, Invoicing_Day
     )
SELECT gbd.*,
       (SELECT SUM(gbd2.Weight)
        FROM grouped_by_date gbd2
        WHERE gbd2.Delivery_Year = gbd.Delivery_Year AND
              (gbd2.Delivery_Month < gbd.Delivery_Month OR
               gbd2.Delivery_Month = gbd.Delivery_Month AND
               gbd2.Invoicing_Day <- gbd.Invoicing_Day
              )
       ) as weight_ytd
FROM grouped_by_date gbd;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...