【问题标题】:Microsoft SQL Server - Recursive JoinMicrosoft SQL Server - 递归连接
【发布时间】:2013-12-06 18:10:38
【问题描述】:

使用 Microsoft SQL Server 2008 R2,我正在尝试将每月数据从 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

我希望结果类似于:

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

【问题讨论】:

  • 你能提供更多信息吗?我不明白这 12 个表的来源。

标签: sql sql-server join recursion


【解决方案1】:

您可以阅读递归公用表表达式。例如:

;WITH Months AS
(
    SELECT 1 as [Month]

    UNION ALL

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

但我认为您正在寻找枢轴运算符。例如:

;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

【讨论】:

    猜你喜欢
    • 2013-07-31
    • 1970-01-01
    • 2017-08-14
    • 2014-08-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多