Microsoft SQL Server-递归联接

Microsoft SQL Server-递归联接,sql,sql-server,join,recursion,Sql,Sql Server,Join,Recursion,使用MicrosoftSQLServer2008R2,我尝试将12个查询中的每月数据递归地连接到1个查询和结果表中。如果我写了12次查询并将每个查询连接起来,我知道如何连接结果,但是查询已经有16行了,所以我正在寻找一种递归方法 我将使用一个销售示例: 我有一张定义如下的桌子 sales(ID int, EmpID int, dt datetime, amount numeric(5,2)). 通过以下查询,我得到了12个表,如何在EmpID上将它们连接在一起,以及如何使用月/年命名列标题:

使用MicrosoftSQLServer2008R2,我尝试将12个查询中的每月数据递归地连接到1个查询和结果表中。如果我写了12次查询并将每个查询连接起来,我知道如何连接结果,但是查询已经有16行了,所以我正在寻找一种递归方法

我将使用一个销售示例:
我有一张定义如下的桌子

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

您可以阅读有关递归公共表表达式的内容。例如:

;WITH Months AS
(
    SELECT 1 as [Month]

    UNION ALL

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

查看SQLFIDLE示例。

您可以阅读有关递归公共表表达式的内容。例如:

;WITH Months AS
(
    SELECT 1 as [Month]

    UNION ALL

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

查看SQLFIDLE示例。

你能提供更多信息吗?我不知道这12个表是从哪里来的。你能提供更多信息吗?我不知道这12个表是从哪里来的。
;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