Вычислить с начала года, предыдущий с начала года в том же запросе

#sql #tsql #sql-server-2008

#sql #tsql #sql-server-2008

Вопрос:

Как я мог бы вычислить, чтобы вычислить С начала года и предыдущий с начала года в том же запросе?

Я пытаюсь вычислить вес и утяжелить с начала года. Я не понял, как добавить вычисление предыдущего с начала года в тот же запрос.

  • С начала года: суммарный вес с первого января по сегодняшний день
  • предыдущий С начала года: Вес суммы с первого января прошлого года по сегодняшний день минус 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. Вы выбираете все данные для всех дат, а затем группируете по годам, месяцам и дате. Таким образом, ваши выходные результаты будут включать строки как за прошлый, так и за этот год. Какие строки за прошлый год должны содержаться в столбце с начала года по дату? (Например, взяв сегодняшнюю дату, 20th March 2019 у вас также будет строка вывода для 21st March 2018 , должен ли в столбце с начала года по дату в этой строке отображаться значение с начала 2019 года?)

2. @MatBailie нет, это не должно

3. Затем, пожалуйста, отредактируйте свой вопрос, чтобы дополнить его подробностями, которые охватывают весь диапазон желаемого поведения.

Ответ №1:

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

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

Комментарии:

1. эта часть кода выдает ошибку SUM ([Вес]) ПОВЕРХ (РАЗДЕЛЕНИЕ По [Delivery_Year], ПОРЯДОК По [Delivery_Month], [Delivery_Day]——эта часть ) КАК Weight_YTD

2. @testtest 1). Вы изменили код, поэтому ваш вопрос не отражает то, как вы его тестируете. 2). Вы не включили сообщение об ошибке. Please update your question with the exact code you tested and the exact error message you received.

3. Сообщение 102, уровень 15, состояние 1, строка 26 Неправильный синтаксис рядом с ‘order’.

4. @testtest Please update your question with the exact code you tested

5. эта часть вашего кода выдает ошибку SUM ([Вес]) ПОВЕРХ (РАЗДЕЛЕНИЕ По [Delivery_Year], ПОРЯДОК По [Delivery_Month], [Delivery_Day]——эта часть ) КАК Weight_YTD ———— Сообщение 102, уровень 15, состояние 1, строка 26 Неправильный синтаксис рядом с ‘order’.