2015-03-23 5 views
0

У меня есть следующий запрос, который предоставляет мне данные о деталях, значениях, расценках и количестве в каждом месте.Доходы из года в год Запрос SQL Server

Я пытаюсь получить годовой доход в зависимости от даты начала и окончания. Например, если выбранная дата была 2013-2015. Конечный результат будет создавать 3 столбца один для дохода в 2013 году, один для дохода за 2014 год и один доход за 2015 год.

Я новичок, и до сих пор не эксперт в написании запросов, но вот то, что я в настоящее время:

SELECT 
    department, 
    item, 
    itemdesc, 
    qty1, 
    qty2, 
    rate_1, 
    rate_2, 
    SUM(mm.days*mm.rate*mm.qty) 
FROM 
    items it 
LEFT JOIN 
    (SELECT 
     i.days, i.rate, i.days, ii.todate, ii.itemid 
    FROM 
     invoiceofitems ii 
    JOIN 
     invoices i on i.id = ii.id 
    WHERE 
     ii.todate BETWEEN @StartDate and @EndDate) mm ON mm.itemid = it.itemid 
GROUP BY 
    department, 
    item, 
    itemdesc, 
    qty1, qty2, 
    rate_1, rate_2 
ORDER BY 
    item 

Однако это не дает мне с каждым годом агрегацию счета доходов, что я требуют.

Я знаю, что этого можно добиться посредством итерации через это. Но как бы я это сделал и с чего бы начать?

Должен ли я знать дату начала и окончания каждого года и проходить через это, а затем добавить счетчик к году до года = EndDate?

Я очень смущен. Помощь была бы оценена.

+0

Зачем вам колонка на каждый год? Почему бы и нет? – Codeman

+0

Ну, идея состоит в том, чтобы узнать, сколько доходов генерируется каждый год в зависимости от даты начала и окончания. Итак, я думаю, что колонка будет иметь наибольший смысл? Я ошибаюсь, чтобы предположить это? –

+0

Я думаю, что разделение его на строки имеет смысл. Столбец SQL намного менее динамичен, чем строка. Вы должны использовать динамический SQL или сгенерированный SQL, чтобы получить вариант количества столбцов, тогда как с помощью строки вы можете просто сгруппировать их и получить то, что вы хотите – Codeman

ответ

0

Я надеюсь, что PIVOT и год поможет вам решить эту проблему (некоторые столбцы опущен):

;WITH SRC(department,item, ... , rate_2, yr, calculation) AS 
(SELECT it.department, it.item, ..., it.rate_2, YEAR(ii.todate) as yr, 
    (i.days * i.rate *i.qty) as calculation 
FROM items it 
LEFT JOIN invoiceofitems ii ON ii.itemid = it.itemid 
JOIN invoices i ON i.id = ii.id) 
SELECT department,item, ..., [2013],[2014],[2015] 
FROM SRC 
PIVOT 
(SUM(calculation) FOR yr IN ([2013],[2014],[2015])) PVT 

Функция YEAR возвращает только «год» часть вашей даты и делает группировку легче. PIVOT просто поворачивает сгруппированные данные из строк в столбцы.

Смежные вопросы