如何从单行创建多个行 - 规范化表

Thr*_*ian 2 sql t-sql sql-server sql-server-2008

我对SQL很新,并试图解决这个问题:

我有一个名为BUDGET的表,一年中每个月有12列,显示该月的预算余额.所以表格如下:

[Department]  [Year]  [Month1] [Month2] .... [Month12]  
ABCD           2010   $5000     $5500   .....  $4000
ABCD           2011   $6000     $6500   .....  $3000
Run Code Online (Sandbox Code Playgroud)

我想要做的是规范化这个表并将每一行分成12行,每行都有一个日期字段,格式如下.我还希望有一个[Balance]列显示该月的值.因此,规范化表格如下所示:

[Department]  [Date]     [Balance] 
ABCD          20100101     $5000   
ABCD          20100201     $5500 
ABCD          20100301     .....
ABCD          .......      ......
Run Code Online (Sandbox Code Playgroud)

我尝试在同一个表上使用CROSS JOIN但是失败了.我也试过使用while循环,但也失败了.任何形式的帮助表示赞赏.谢谢!

编辑:我正在使用SQL Server 2008

Eri*_*ikE 10

只是为了好玩,这是一个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);
Run Code Online (Sandbox Code Playgroud)

它与@Aaron Bertrand的UNPIVOT没有什么不同,没有使用UNPIVOT.

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