我有以下查询,它为我提供了每个位置的项目和项目详细信息,值,费率和数量。
我正在尝试根据开始日期和结束日期获得年度收入。例如,如果选择的日期是2013-2015。最终结果将为2013年收入创建3列,一列为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 :(得分:0)
我希望PIVOT和YEAR帮助您解决这个问题(省略了一些列):
;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只是将分组数据从行旋转到列。