我对SQL相当陌生,并试图弄清楚这一点:

我有一个名为BUDGET的表,该表在一年中的每个月都有12列,显示该月的预算余额。因此表如下所示:

[Department]  [Year]  [Month1] [Month2] .... [Month12]
ABCD           2010   $5000     $5500   .....  $4000
ABCD           2011   $6000     $6500   .....  $3000

我想做的是规范化此表并将每一行分成12行,每一行带有以下格式的日期字段。我还希望有一个[余额]列来显示该月的值。因此,标准化表将如下所示:
[Department]  [Date]     [Balance]
ABCD          20100101     $5000
ABCD          20100201     $5500
ABCD          20100301     .....
ABCD          .......      ......

我尝试在同一张表上使用CROSS JOIN,但失败了。我也尝试过使用while循环,但是也失败了。任何帮助都将受到赞赏。谢谢!

编辑:我正在使用SQL Server发行日为2008

最佳答案

只是为了好玩,这里有一个CROSS APPLY解决方案:

SELECT
   B.Department,
   DateAdd(month, (B.Year - 1900) * 12 + M.Mo - 1, 0) [Date],
   M.Balance
FROM
   dbo.Budget B
   CROSS APPLY (
      VALUES
      (1, Month1), (2, Month2), (3, Month3), (4, Month4), (5, Month5), (6, Month6),
      (7, Month7), (8, Month8), (9, Month9), (10, Month10), (11, Month11), (12, Month12)
   ) M (Mo, Balance);

如果不使用UNPIVOT,它与@Aaron Bertrand的UNPIVOT确实没有什么不同。

如果必须将日期作为字符串,则将字符串像('01', Month1)一样放在CROSS APPLY中,并将SELECT更改为Convert(char(4), B.Year) + M.Mo

10-08 19:57