Оператор SQL - хотите, чтобы ежедневные даты были свернуты и отображались как год
У меня есть данные за два года, которые я суммирую, например
Дата | Ingredient_cost_Amount| Cost_Share_amount |
Я просматриваю данные за два года за 2012 и 2013 годы, я хочу свести все итоги, чтобы у меня было только две строки, одна строка за 2012 год и одна строка за 2013 год. Как написать оператор SQL, который будет выглядеть в датах, но отображаются только 4 цифры года против 8 цифр ежедневной даты. Я подозреваю, что о сумме этой части мы позаботимся, суммируя эти столбцы с вычислениями, поэтому я действительно ищу помощь в том, как переставить ежедневную дату в год из 4 цифр. Помощь очень ценится.
2 ответа
select DATEPART(year,[Date]) [Year]
, sum(Ingredient_cost_Amount) Total
from @table
group by DATEPART(year,[Date])
Определить диапазон / таблицу группировки.
Нечто похожее на следующее должно работать в большинстве РСУБД:
SELECT Grouping.id, SUM(Ingredient.ingredient_cost_amount) AS Ingredient_Cost_Amount,
SUM(Ingredient.cost_share_amount) AS Cost_Share_Amount
FROM (VALUES (2013, DATE('2013-01-01'), DATE('2014-01-01')),
(2012, DATE('2012-01-01'), DATE('2013-01-01'))) Grouping(id, gStart, gEnd)
JOIN Ingredient
ON Ingredient.date >= Grouping.gStart
AND Ingredient.date < Grouping.gEnd
GROUP BY Grouping.id
(DATE()
и связанные функции преобразования сильно зависят от БД. Некоторые РСУБД не поддерживают использование VALUES
таким образом, хотя существуют и другие способы создания таблицы виртуальной группировки)
Посмотрите этот пост в блоге, чтобы узнать, почему я использовал исключительную верхнюю границу диапазона.
Использование таблицы диапазонов таким способом потенциально позволит БД использовать индексы, чтобы помочь с агрегацией. Насколько это помогает, зависит от множества других факторов, например, от конкретной используемой СУБД.