2013-11-22 130 views
1

使用Microsoft SQL Server 2008 R2,我试图递归地将12个查询的每月数据连接到1个查询和结果表中。我知道如何连接结果,如果我写出12次查询并加入每个查询,但查询已经有16行,所以我正在寻找一种递归的方式。Microsoft SQL Server - 递归连接

我将使用一个销售例如:
我有一个表具有以下确定指标

sales(ID int, EmpID int, dt datetime, amount numeric(5,2)). 

用下面的查询,我得到12桌,我该如何加入他们一起上的EmpID哪有我的名字列标题与月/年:

DECLARE @mo INT, @yr INT 
SET @mo = 1 
SET @yr = YEAR(GETDATE()) 
WHILE (@mo < 13) 
BEGIN 
    SELECT EmpID, SUM(numeric) AS Totals WHERE MONTH(dt) = @mo AND YEAR(dt) = @yr GROUP BY EmpID 
    SET @mo = @mo + 1 
END 

我想结果是这样的:

EmpID  1-2012  2-2012 ... 12-2012 
-----  ------- -------   ------- 
1   XXXX.XX XXXX.XX   XXXX.XX 
... 
100  XXXX.XX XXXX.XX   XXXX.XX 
+0

你可以提供更多的信息,我不明白12桌来自哪里。 – Juan

回答

1

你可以阅读关于递归公用表表达式。 EG:

;WITH Months AS 
(
    SELECT 1 as [Month] 

    UNION ALL 

    SELECT [Month] + 1 
    FROM Months 
    WHERE [Month] + 1 < 13 
), 
SELECT [Month] 
FROM Months 

但我想你正在寻找数据透视运算符。 EG:

;WITH SalesByMonth AS (
    SELECT 
     EmpID 
    ,MONTH(dt) AS Month 
    ,SUM(Amount) AS Total 
    FROM 
     @sales 
    WHERE 
     YEAR(dt) = @Year 
    GROUP BY 
     EmpID 
    ,MONTH(dt) 
) 
SELECT 
    EmpID, [1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12] 
FROM (
    SELECT 
    EmpID 
    ,Month 
    ,Total 
    FROM 
    SalesByMonth) up 
PIVOT (SUM(Total) FOR Month IN ([1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12])) AS pvt 
ORDER BY 
    EmpID 

查看SQLFiddle示例here