До сих пор неясно, каких результатов / поведения вы на самом деле хотите.
Одна из возможных интерпретаций заключается в том, что «год к дате» относится к дате в таблице, а не к «сегодня» / 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()
, но есть "хитрые приемы", которые могут ее смоделировать ...
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