2015-07-27 4 views
1

Я переставляю свой вопрос. У меня есть простая таблица ниже:SQL Server using dateadd

Item  Date  QTY 
Chair  12/6/08 69 

Я хотел бы использовать SQL Server, чтобы вытащить эти элементы из Item колонки в течение трех лет до Date колонны и трех лет или после Date колонны.

Например, Chair вещь, мне нравится знать, сколько стульев было продано за три года до 12/16/08; и сколько кресел продано 12/6/08 или после 12/06/08.

Ниже представлен мой желаемый результат с каждым годом и стулом. Я думал использовать функцию Dateadd, но не знаю, как ее записать. Большое спасибо.

Year3 Year2 Year1  Date  Year1 Year2  Year3 
12/5/05 12/5/06 12/5/07 12/6/08 12/6/09 12/6/10 12/6/11 
199  322  233     344  783  564 
+0

Используйте 'pivot' или условную агрегацию. Измените свой вопрос с помощью подхода, который вы пробовали. –

ответ

-1

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

+0

Вы только что скопировали комментарий Гордона? – Blindy

+0

О, я не вижу этого комментария .. –

0

Ниже только доказать концепции с TSQL, так как я не уверен, что для ежегодной агрегации вам нужно свертывание или ломтик суммы

declare @t table (item varchar(50), [date] date, Qty int) 

insert into @t 
values 
('Chair', '20080612', 69), 
('Chair', '20070612', 7), 
('Chair', '20060612', 6), 
('Chair', '20050612', 5), 
('Chair', '20040612', 4), 
('Chair', '20030612', 3), 
('Chair', '20020612', 2), 
('Chair', '20010612', 1), 
('Chair', '20090612', 9), 
('Chair', '20100612', 10), 
('Chair', '20110612', 11), 
('Chair', '20120612', 12) 


select t.item 
    , sum(case when t1.[date] >= Dateadd(year, -3, t.[date]) and t1.[date] < t.[date] then t1.Qty else 0 end) as [-year3] 
    , sum(case when t1.[date] >= Dateadd(year, -2, t.[date]) and t1.[date] < t.[date] then t1.Qty else 0 end) as [-year2] 
    , sum(case when t1.[date] >= Dateadd(year, -1, t.[date]) and t1.[date] < t.[date] then t1.Qty else 0 end) as [-year1] 
    , t.date 
    , SUM(case when t1.[date] <= DATEADD(year, 1, t.[date]) and t1.[date] > t.[date] then t1.Qty else 0 end) as [+year1] 
    , SUM(case when t1.[date] <= DATEADD(year, 2, t.[date]) and t1.[date] > t.[date] then t1.Qty else 0 end) as [+year2] 
    , SUM(case when t1.[date] <= DATEADD(year, 3, t.[date]) and t1.[date] > t.[date] then t1.Qty else 0 end) as [+year3] 
from @t t join @t t1 on t.item = t1.item 
group by t.date, t.item 
order by 1 
Смежные вопросы