我正在寻找一种有效的方法来转换行到列在SQL服务器,我听说PIVOT不是很快,我需要处理大量的记录。
这是我的例子:
-------------------------------
| Id | Value | ColumnName |
-------------------------------
| 1 | John | FirstName |
| 2 | 2.4 | Amount |
| 3 | ZH1E4A | PostalCode |
| 4 | Fork | LastName |
| 5 | 857685 | AccountNumber |
-------------------------------
这是我的成果:
---------------------------------------------------------------------
| FirstName |Amount| PostalCode | LastName | AccountNumber |
---------------------------------------------------------------------
| John | 2.4 | ZH1E4A | Fork | 857685 |
---------------------------------------------------------------------
如何构建结果?
4条答案
按热度按时间insrf1ej1#
有几种方法可以将数据从多行转换到列中。
使用
PIVOT
在SQL Server中,可以使用
PIVOT
函数将数据从行转换为列:请参阅Demo。
具有未知
columnnames
数的枢轴如果要转置的
columnnames
的数目未知,则可以使用动态SQL:请参阅Demo。
使用集合函数
如果您不想使用
PIVOT
函数,则可以将聚合函数与CASE
表达式一起使用:请参阅Demo。
使用多个联接
这也可以使用多个联接来完成,但您需要一些列来关联示例数据中没有的每一行。但基本语法为:
vdzxcuhz2#
这是一种方法,而不仅仅是一个脚本,但它为您提供了更大的灵活性。
首先有3个对象:
1.用户定义的TABLE类型[
ColumnActionList
] -〉将数据作为参数保存proc_PivotPrepare
] -〉准备数据proc_PivotExecute
] -〉执行脚本创建类型[dbo].[列操作列表] AS表([ID] [smallint]非空,[列名] nvarchar非空,[操作] nchar非空);执行
通过执行第一个查询(通过传递源DB和表名),您将获得为第二个SP预先创建的执行查询,您所要做的就是定义来自源的列:+ Stable + Value(将用于集中基于该值的值)+ Dim(要用作透视依据的列)
将自动定义名称和数据类型!
我不能推荐它用于任何生产环境,但为临时BI请求做这项工作。
luaexgnf3#
请尝试
lyr7nygr4#
另一个可能非常有用的选项是使用CROSS APPLY