这是数据的一小部分。在实际数据中,“名称”和“代码”下的值有数百个,并且这些值经常更改。因此,对Pivot语句进行硬编码将不起作用。需要创建一个动态SQL语句- 我需要帮助。
DECLARE @Test Table ( Name Varchar(32), Code Varchar(20) ) INSERT INTO @Test(Name, Code) VALUES ('A-1', 'A-One') , ('A 2', 'A-Two') , ('B 1-b', 'B-One') , ('B', 'A-Two') , ('C', 'A-One') , ('C', 'B-One') , ('C', 'C-One')
样本数据集看起来像这样[再次,这只是一个小样本]:
Name Code A-1 A-One A 1 A-Two B 1-b B-One B A-Two C A-One C B-One C C-One
请注意,代码值(例如A-One,A-Two和B-One)可能与一个以上的Name值相关联。
例如,A-One与名称A-1以及名称C一起出现。
我想输出它,使其看起来像这样[除了,除了我显示的值外,还有更多的值-并且这些值可以更改]:
A-1 A 1 B 1-b B C A-One X X A-Two X X B-One X X C-One X
“名称”值和“代码”值的数量可以更改。它们不是恒定的。
目的是能够在左侧查看“代码”值的列表-并轻松查看与“代码”关联的“名称”值。
我相信这需要创建动态数据透视表sql,并且我在理解数据透视表sql时遇到了麻烦,我将不胜感激任何帮助或指针。
您可以使用动态枢轴:
create table dbo.test([Name] Varchar(32), Code Varchar(30)) insert into dbo.test values ('A-1', 'A-One') , ('A 2', 'A-Two') , ('B 1-b', 'B-One') , ('B', 'A-Two') , ('C', 'A-One') , ('C', 'B-One') , ('C', 'C-One') declare @cols nvarchar(max)='' --holds all the values that will become column names declare @alias nvarchar(max)='' --holds values that will become column names and converts values to 'x' declare @sql nvarchar(max)='' --contains the TSQL dinamically generated select @cols = @cols + ', [' + [Name] + ']' from dbo.test group by [Name] select @alias = @alias + ', case when T.[' + [Name] + '] is not null then ''x'' else '''' end as [' + [Name] + ']' from dbo.test group by [Name] set @cols = RIGHT(@cols, len(@cols)-2) set @sql = @sql + ' select T.Code ' + @alias + ' from (' set @sql = @sql + ' select piv.[Code], ' + @cols set @sql = @sql + ' from dbo.test ' set @sql = @sql + ' pivot (max([Name]) for [Name] in ('+@cols+') ) piv ' set @sql = @sql + ' ) T' --execute dynamic query exec(@sql)
结果: