Sql server TSQL:基于varchar值的动态透视无法正常工作
我有两个正在使用的表:Sql server TSQL:基于varchar值的动态透视无法正常工作,sql-server,tsql,dynamic-pivot,Sql Server,Tsql,Dynamic Pivot,我有两个正在使用的表: zEaAttributes:用于字段列表 zEAValues:我们想要关注的数据 我希望得到的结果是一行数据,如下所示: Name Street Address State County Zip -------------------------------------------- Ajax ABC 1st Ave. TX NULL NULL Name Street Address State County
- zEaAttributes:用于字段列表
- zEAValues:我们想要关注的数据
Name Street Address State County Zip
--------------------------------------------
Ajax ABC 1st Ave. TX NULL NULL
Name Street Address State County Zip
---------------------------------------------
Ajax NULL NULL NULL NULL
NULL ABC 1st Ave. NULL NULL NULL
NULL NULL TX NULL NULL
但是,我得到了3行,看起来像这样:
Name Street Address State County Zip
--------------------------------------------
Ajax ABC 1st Ave. TX NULL NULL
Name Street Address State County Zip
---------------------------------------------
Ajax NULL NULL NULL NULL
NULL ABC 1st Ave. NULL NULL NULL
NULL NULL TX NULL NULL
下面是创建和填充我们正在测试的两个表的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], [Position], [Caption])
VALUES ('3fc25249-6b2a-40e6-839d-7e91b01d989f', 2, 'Street Address')
INSERT INTO [dbo].[zEaAttributes] ([Ent_Id], [Position], [Caption])
VALUES ('3fc25249-6b2a-40e6-839d-7e91b01d989f', 3, 'State')
INSERT INTO [dbo].[zEaAttributes] ([Ent_Id], [Position], [Caption])
VALUES ('3fc25249-6b2a-40e6-839d-7e91b01d989f', 4, 'County')
INSERT INTO [dbo].[zEaAttributes] ([Ent_Id], [Position], [Caption])
VALUES ('3fc25249-6b2a-40e6-839d-7e91b01d989f', 5, 'Zip')
CREATE TABLE [dbo].[zEAValues]
(
[Ent_Id] [uniqueidentifier] NOT NULL,
[Position] [smallint] NOT NULL,
[Caption] [varchar](50) NULL,
[Value] [nvarchar](max) NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
INSERT INTO [dbo].[zEAValues] ([Ent_Id], [Position], [Caption], [Value])
VALUES ('3fc25249-6b2a-40e6-839d-7e91b01d989f', 1, 'Name', N'Ajax')
INSERT INTO [dbo].[zEAValues] ([Ent_Id], [Position], [Caption], [Value])
VALUES ('3fc25249-6b2a-40e6-839d-7e91b01d989f', 2, 'Street Address', N'ABC 1st Ave.')
INSERT INTO [dbo].[zEAValues] ([Ent_Id], [Position], [Caption], [Value])
VALUES ('3fc25249-6b2a-40e6-839d-7e91b01d989f', 3, '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)
通过向相关查询中添加
groupby[Ent\u Id]
可以修复您的3行输出。
对PIVOT
使用如下查询:
SET @FinalTableStruct =
'SELECT * FROM
(
SELECT [Ent_Id], [Caption], [Value] FROM zEAValues
) x
PIVOT
(
MAX([Value]) FOR Caption IN (' + @DynamicColumns + ')
) p'
通过使用此查询,数据库引擎将自动利用
分组依据[Ent\u Id]
。位置列中的不同值导致透视
将值移动到相应行。您需要在执行操作时删除该列,因为根据输出不需要该列。
下面将这样做:
SET @FinalTableStruct = 'SELECT ' + @DynamicColumns +
' FROM (select caption, [Value] from zEAValues) x
PIVOT
(
MAX(Value) FOR Caption IN ('+ @DynamicColumns + ')
) p'
print @FinalTableStruct
EXECUTE(@FinalTableStruct)
谢谢大家。这些解决了我的问题。