Рассчитать YTD, предыдущий YTD в том же запросе - PullRequest
0 голосов
/ 20 марта 2019

Как можно рассчитать, чтобы рассчитать YTD и предыдущую 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

1 Ответ

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

До сих пор неясно, каких результатов / поведения вы на самом деле хотите.

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