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 2008 R2,将列转换为行,将行转换为列[重复]