sql - 如何从单行创建多行-标准化表

标签 sql sql-server sql-server-2008 tsql

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

关于sql - 如何从单行创建多行-标准化表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11837928/

相关文章:

sql - SQL Server 上的预留空间过多

php - SQL Server 表到 MySQL 表

ruby-on-rails - 如何在 Rails 中使用 rake 任务连接到 SQL Server?

sql - TABLOCK 和 TABLOCKX 定义示例

sql - 在同一张表上使用子查询在 MySQL 中编写 sql 查询

sql - 将 Currency 格式化为数百万美元 SQL Server

c# - 如何设置 SMO ScriptingOptions 以保证表的精确副本?

sql - 使用 Azure SQL-db 安排 SQL 查询以将数据从一个表移动到另一个表

sql-server-2008 - 参数数据类型 numeric 对于子字符串函数的参数 1 无效

sql-server - 为什么 SQL Server 意外停止发出范围锁