消息 102,级别 15,状态 1,第 28 行 'order' 附近的语法不正确
Msg 102, Level 15, State 1, Line 28 Incorrect syntax near 'order'
我正在尝试以下查询,但出现错误。我正在尝试在同一个查询中计算 YTD 和之前的 YTD。
Msg 102, Level 15, State 1, Line 28 Incorrect syntax near '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上搜索了一下好像是link我用的版本问题,其实是:
SELECT @@VERSION
Microsoft SQL Server 2008 R2 (SP3) - 10.50.6220.0 (X64) Mar 19 2015
12:32:14 Copyright (c) Microsoft Corporation Enterprise Edition
(64-bit) on Windows NT 6.3 (Build 9600: ) (Hypervisor)
我该如何解决我的问题?我无法更改版本。
SQL Server 2008 不支持累计window 函数,因此您需要进行不同的计算。子查询或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;
我正在尝试以下查询,但出现错误。我正在尝试在同一个查询中计算 YTD 和之前的 YTD。
Msg 102, Level 15, State 1, Line 28 Incorrect syntax near '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上搜索了一下好像是link我用的版本问题,其实是:
SELECT @@VERSION
Microsoft SQL Server 2008 R2 (SP3) - 10.50.6220.0 (X64) Mar 19 2015 12:32:14 Copyright (c) Microsoft Corporation Enterprise Edition (64-bit) on Windows NT 6.3 (Build 9600: ) (Hypervisor)
我该如何解决我的问题?我无法更改版本。
SQL Server 2008 不支持累计window 函数,因此您需要进行不同的计算。子查询或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;