SQL Server查询逐年收入

时间:2015-03-23 17:50:59

标签: sql sql-server sql-server-2008 tsql sql-server-2008-r2

我有以下查询,它为我提供了每个位置的项目和项目详细信息,值,费率和数量。

我正在尝试根据开始日期和结束日期获得年度收入。例如,如果选择的日期是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?

我非常困惑。帮助将不胜感激。

1 个答案:

答案 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只是将分组数据从行旋转到列。