我对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
。