#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’.