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)

谢谢大家。这些解决了我的问题。