在同一查询中计算 YTD、上一个 YTD
Calculate YTD, Previous YTD in the same query
如何在同一个查询中计算 YTD 和之前的 YTD?
我尝试计算重量和年初至今的重量。我不明白如何在同一个查询中添加之前 ytd 的计算。
- YTD:从一月一日到今天的权重总和
- 年初至今:总和
去年一月一日到今天的权重减去1年
SELECT SUM(CASE
WHEN convert(date,s.Delivery_Year+'-'+ s.Delivery_month+'-'+ s.Delivery_day) BETWEEN dateadd(yy, DATEDIFF(yy, 0, GETDATE()), 0) AND GETDATE() THEN s.Weight
ELSE 0
END) AS WeightYTD ,
sum(Weight) AS weight ,
[Sales_Organization] ,
[Market_Grp] ,
[Delivery_Year] ,
[Delivery_month] ,
Delivery_day
FROM Fact_sales s
GROUP BY ,
[Sales_Organization] ,
[Market_Grp] ,
[Delivery_Year] ,
[Delivery_month] ,
Delivery_day
目前还不清楚 results/behaviour 你到底想要什么。
一种可能的解释是 "year to date" 是相对于 table 中的日期,而不是相对于 "today" / GETDATE()
.
所以...
- 对于
14th March 2018
:年初至今 = 1st Jan 2018
至 14th March 2018
- 对于
20th March 2019
:年初至今 = 1st Jan 2019
至 20th March 2019
既然如此,我将执行以下操作以获取 YTD
列...
WITH
grouped_by_date AS
(
SELECT
[Sales_Organization],
[Market_Grp],
[Delivery_Year],
[Delivery_Month],
[Delivery_Day],
SUM([Weight]) AS Weight
FROM
Fact_sales s
GROUP BY
[Sales_Organization],
[Market_Grp],
[Delivery_Year],
[Delivery_Month],
[Delivery_Day]
),
cumulative_sum_for_ytd AS
(
SELECT
*,
SUM([Weight]) OVER (PARTITION BY [Delivery_Year]
ORDER BY [Delivery_Month], [Delivery_Day]
)
AS Weight_YTD
FROM
grouped_by_date
),
SQL Server 2008 中没有LAG()
功能,但有"hacky tricks" 可以模拟它...
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
如何在同一个查询中计算 YTD 和之前的 YTD?
我尝试计算重量和年初至今的重量。我不明白如何在同一个查询中添加之前 ytd 的计算。
- YTD:从一月一日到今天的权重总和
- 年初至今:总和 去年一月一日到今天的权重减去1年
SELECT SUM(CASE
WHEN convert(date,s.Delivery_Year+'-'+ s.Delivery_month+'-'+ s.Delivery_day) BETWEEN dateadd(yy, DATEDIFF(yy, 0, GETDATE()), 0) AND GETDATE() THEN s.Weight
ELSE 0
END) AS WeightYTD ,
sum(Weight) AS weight ,
[Sales_Organization] ,
[Market_Grp] ,
[Delivery_Year] ,
[Delivery_month] ,
Delivery_day
FROM Fact_sales s
GROUP BY ,
[Sales_Organization] ,
[Market_Grp] ,
[Delivery_Year] ,
[Delivery_month] ,
Delivery_day
目前还不清楚 results/behaviour 你到底想要什么。
一种可能的解释是 "year to date" 是相对于 table 中的日期,而不是相对于 "today" / GETDATE()
.
所以...
- 对于
14th March 2018
:年初至今 =1st Jan 2018
至14th March 2018
- 对于
20th March 2019
:年初至今 =1st Jan 2019
至20th March 2019
既然如此,我将执行以下操作以获取 YTD
列...
WITH
grouped_by_date AS
(
SELECT
[Sales_Organization],
[Market_Grp],
[Delivery_Year],
[Delivery_Month],
[Delivery_Day],
SUM([Weight]) AS Weight
FROM
Fact_sales s
GROUP BY
[Sales_Organization],
[Market_Grp],
[Delivery_Year],
[Delivery_Month],
[Delivery_Day]
),
cumulative_sum_for_ytd AS
(
SELECT
*,
SUM([Weight]) OVER (PARTITION BY [Delivery_Year]
ORDER BY [Delivery_Month], [Delivery_Day]
)
AS Weight_YTD
FROM
grouped_by_date
),
SQL Server 2008 中没有LAG()
功能,但有"hacky tricks" 可以模拟它...
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