[英]SQL Server - Change unknown number of row values into column names
我有一张这样的表:
process_id process_info value date
------------------------------------------------------
A chop 3 2020-05
A chop 4 2020-07
A extrude 6 2020-01
B something 2 2019-52
B something 4 2020-05
如您所见,此表表示某个 process_info 和 process_id 的值随时间(年-周)的变化。 但是我想将日期行值转换为列名并以这种方式表示数据。 Pivot 不起作用,因为我不知道日期列中的每个值。
我想做到这一点:
process_id process_info 2019_52_values 2020_01_values 2020_05_values
B something 2 4
A extrude 6
A chop 3
等等。
我有一个类似的问题。 我通过在 T-SQL 中生成动态 SQL 解决了这个问题。 我首先查询了列。 然后我创建了一个用于数据收集的数据透视 sql。 我用EXEC sp_executesql @Query
执行的这个查询
最后,所有这些都被包装到一个存储过程中。
Tipp:创建列名时确保它们有效: QUOTENAME()
是一个不错的选择。
您可以为此使用动态 SQL。
尝试以下操作:
DECLARE @cols NVARCHAR(MAX), @cols_to_display NVARCHAR(MAX), @query NVARCHAR(MAX);
SET @cols_to_display = STUFF(
(
SELECT DISTINCT
','+QUOTENAME(t.[date])+ ' as '''+replace(t.[date], '-', '_')+'_values'''
FROM TestTable t FOR XML PATH(''), TYPE
).value('.', 'nvarchar(max)'), 1, 1, ''
);
SET @cols = STUFF(
(
SELECT DISTINCT
','+QUOTENAME(t.[date])
FROM TestTable t FOR XML PATH(''), TYPE
).value('.', 'nvarchar(max)'), 1, 1, ''
);
SET @query = 'SELECT process_id, process_info, '+@cols_to_display+'
FROM (
SELECT process_id, process_info, [value], [date]
FROM TestTable
)x
PIVOT
(
SUM([value]) FOR [date] in ('+replace(@cols, '_values', '')+')
) pvt';
print @query
EXECUTE (@query);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.