让我解释一下我的桌子是如何设置的。
我在SQL Server中有一个表:
CREATE TABLE [dbo].[CountyCaseUserData]
(
[CCId] [int] IDENTITY(1,1) NOT NULL,
[CaseTypeId] [int] NULL,
[UserInput] [varchar](max) NULL,
[UserMasterId] [numeric](18, 0) NULL,
[DepartmentId] [int] NULL,
[DisplayLabel] [varchar](100) NULL,
[UniqueEntryRowId] [varchar](20) NULL,
[UniqueEntryId] [varchar](20) NULL,
)
请检查图像中的数据存储方式。
现在我想得到这样的结果:
列标题为DisplayLabel
,数据为UserInput
。而且我认为不仅仅是为了转置数据,因为标题是重复的。
UniqueEntryRowId
对于每个条目组合都是唯一的,当它更改时,预计数据会出现在另一行中。
如有需要,请询问任何细节。谢谢
使用此查询:
DECLARE @DynamicPivotQuery AS NVARCHAR(MAX)
DECLARE @ColumnName AS NVARCHAR(MAX)
--Get distinct values of the PIVOT Column
SELECT
@ColumnName= ISNULL(@ColumnName + ',','') + QUOTENAME(DisplayLabel)
FROM
(SELECT DISTINCT DisplayLabel
FROM CountyCaseUserData) AS DisplayLabel
--Prepare the PIVOT query using the dynamic
SET @DynamicPivotQuery =
N'SELECT UniqueEntryRowId, ' + @ColumnName + '
FROM CountyCaseUserData
PIVOT(max(UserInput)
FOR DisplayLabel IN (' + @ColumnName + ')) AS PVTTable'
--Execute the Dynamic Pivot Query
EXEC sp_executesql @DynamicPivotQuery
但它返回:
你能指出我在哪里错了吗?
答案 0 :(得分:2)
请参阅以下代码:
我通过DisplayLabel添加了row_number()函数和分区来对相同的记录进行分组并提供唯一的行号索引
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX);
select @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.DisplayLabel)
FROM [dbo].[CountyCaseUserData] c
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT ' + @cols + '
from
(
SELECT UserInput, DisplayLabel,row_number()
over (partition by DisplayLabel order by CCId) AS No
from [dbo].[CountyCaseUserData]
) x
pivot
(
max(UserInput)
for DisplayLabel in (' + @cols + ')
) p ';
execute(@query)
请参阅下面的屏幕截图: