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

Использование таблицы диапазонов таким способом потенциально позволит БД использовать индексы, чтобы помочь с агрегацией. Насколько это помогает, зависит от множества других факторов, например, от конкретной используемой СУБД.

Другие вопросы по тегам