如何解决TSQL:基于 varchar 值的动态数据透视表无法正常工作
我正在处理 2 个表:
- zEaAttributes:用于字段列表
- zEAValues:我们想要透视的数据
我期望得到的结果将是这样的一行数据:
Name Street Address State County Zip
--------------------------------------------
Ajax ABC 1st Ave. TX NULL NULL
但相反,我得到了 3 行,如下所示:
Name Street Address State County Zip
---------------------------------------------
Ajax NULL NULL NULL NULL
NULL ABC 1st Ave. NULL NULL NULL
NULL NULL TX NULL NULL
下面是用于创建和填充我们正在测试的 2 个表的 SQL。请让我知道我做错了什么。
谢谢。
CREATE TABLE [dbo].[zEaAttributes]
(
[Ent_Id] [uniqueidentifier] NOT NULL,[Position] [smallint] NOT NULL,[Caption] [varchar](50) NULL
) ON [PRIMARY]
INSERT INTO [dbo].[zEaAttributes] ([Ent_Id],[Position],[Caption])
VALUES ('3fc25249-6b2a-40e6-839d-7e91b01d989f',1,'Name')
INSERT INTO [dbo].[zEaAttributes] ([Ent_Id],2,'Street Address')
INSERT INTO [dbo].[zEaAttributes] ([Ent_Id],3,'State')
INSERT INTO [dbo].[zEaAttributes] ([Ent_Id],4,'County')
INSERT INTO [dbo].[zEaAttributes] ([Ent_Id],5,'Zip')
CREATE TABLE [dbo].[zEAValues]
(
[Ent_Id] [uniqueidentifier] NOT NULL,[Caption] [varchar](50) NULL,[Value] [nvarchar](max) NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
INSERT INTO [dbo].[zEAValues] ([Ent_Id],[Caption],[Value])
VALUES ('3fc25249-6b2a-40e6-839d-7e91b01d989f','Name',N'Ajax')
INSERT INTO [dbo].[zEAValues] ([Ent_Id],'Street Address',N'ABC 1st Ave.')
INSERT INTO [dbo].[zEAValues] ([Ent_Id],'State',N'TX')
--Get a list of the "Fields" (Columns)
DECLARE @DynamicColumns AS VARCHAR(max)
SELECT @DynamicColumns = COALESCE(@DynamicColumns + ',','')
+ Quotename(Caption)
FROM (SELECT DISTINCT Caption,Position
FROM zEaAttributes
) AS FieldList
ORDER BY Position
--Build the Dynamic Pivot Table Query
DECLARE @FinalTableStruct AS NVARCHAR(max)
SET @FinalTableStruct = 'SELECT ' + @DynamicColumns +
' FROM zEAValues x PIVOT ( MAX( Value ) FOR Caption IN ('
+ @DynamicColumns + ') ) p '
EXECUTE(@FinalTableStruct)
解决方法
您的 3 行输出将通过向相关查询添加 GROUP BY [Ent_Id]
来修复。
对 PIVOT
使用这样的查询:
SET @FinalTableStruct =
'SELECT * FROM
(
SELECT [Ent_Id],[Caption],[Value] FROM zEAValues
) x
PIVOT
(
MAX([Value]) FOR Caption IN (' + @DynamicColumns + ')
) p'
通过使用此查询,数据库引擎将自动使用 GROUP BY [Ent_Id]
。
位置列中的不同值导致 PIVOT
将值移动到相应的行。您需要在执行操作时删除列,因为根据输出不需要它。
以下将做到这一点:
SET @FinalTableStruct = 'SELECT ' + @DynamicColumns +
' FROM (select caption,[Value] from zEAValues) x
PIVOT
(
MAX(Value) FOR Caption IN ('+ @DynamicColumns + ')
) p'
print @FinalTableStruct
EXECUTE(@FinalTableStruct)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。