繁体   English   中英

SQL Server - 将未知数量的行值更改为列名

[英]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);

请在此处找到 db<>fiddle( 此处还提供了另一种方法)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM