SQL Server:将列转换为另一个并将其值附加到单独的列

Posted

技术标签:

【中文标题】SQL Server:将列转换为另一个并将其值附加到单独的列【英文标题】:SQL server: unpivot column into another and append its value to separate column 【发布时间】:2020-11-05 12:21:48 【问题描述】:

给出下表格式(而不是视图),并带有示例

 Name  | MonthYear |      Type     | budget | actual | revenue_forecast
google |   Nov-20  | Gross Billing |   50   |   70   | 40

我想让它有两行,'revenue_forecast' 成为一种类型,它的值显示在预算之下,就像这样

 Name  | MonthYear |      Type        | budget | actual 
google |   Nov-20  | Gross Billing    |   50   |   70   
google |   Nov-20  | revenue_forecast |   40   |   null   

任何想法如何做到这一点?在这种情况下有点挣扎的非透视逻辑

【问题讨论】:

为了让我们快速回答这些类型的问题,您应该以构建源表或变量的语句的形式发布,或者在 SqlFiddle 中设置数据集 【参考方案1】:

您可以尝试使用VALUES 表值构造函数进行反透视,但请仔细考虑列的数据类型:

SELECT t.Name, t.MonthYear, v.[Type], v.budget, v.actual
FROM YourTable t
CROSS APPLY (VALUES
   (t.[type], t.budget, t.actual),
   ('revenue_forecast', t.revenue_forecast, NULL)
) v ([type], budget, actual)

以下完整查询可用于测试:

declare @table Table
(
    Name varchar(50),
    MonthYear varchar(10),
    Type Varchar(50),
    budget int,
    actual int,
    revenue_forecast int
)
INSERT INTO @table (Name, MonthYear, Type, budget, actual, revenue_forecast)
Values('google', 'Nov-20','Gross Billing',50,70,40)

select * from @table

SELECT t.Name, t.MonthYear, v.[Type], v.budget, v.actual
FROM @table t
CROSS APPLY (VALUES
   (t.[type], t.budget, t.actual),
   ('revenue_forecast', t.revenue_forecast, NULL)
) v ([type], budget, actual)

【讨论】:

已验证,可以完成这项工作

以上是关于SQL Server:将列转换为另一个并将其值附加到单独的列的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server - 将 varchar 转换为另一个排序规则(代码页)以修复字符编码

SQL Server:将列转换为行

SQL server 如何将列值转换为行

SQL Server 2008 R2,将列转换为行,将行转换为列[重复]

如何将 JSON 中的 SQL 主键转换为 javascript 对象键,并将其他数据作为其值

将列作为参数传递给 SQL Server 中的 dateadd