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.
| 归档时间: |
|
| 查看次数: |
9209 次 |
| 最近记录: |