具有两列的pivot组合ms sql

具有两列的pivot组合ms sql,sql,Sql,我想拿出一个结果,在透视模式下显示表中的值。但是,其他行的列名是Person_Id和Author_Number的组合,该列的值应为Project_Id。为便于理解,请参阅下面的示例结果: Client_Id 12345_1 12345_2 12346_1 12346_2 12346_1 Client1 Test1 Test1 Client2 Test2 Test2 Client3

我想拿出一个结果,在透视模式下显示表中的值。但是,其他行的列名是Person_Id和Author_Number的组合,该列的值应为Project_Id。为便于理解,请参阅下面的示例结果:

Client_Id  12345_1   12345_2  12346_1  12346_2 12346_1
Client1     Test1      Test1   
Client2                       Test2    Test2  
Client3                                        Test3   
请注意,第二列是Person_Id和Author_Number的组合,依此类推

这是样品表

CREATE TABLE [dbo].[Authors](
        [Client_Id] [nvarchar](50) NOT NULL,
        [Project_Id] [nvarchar](50) NOT NULL,
        [Person_Id] [int] NOT NULL,
        [Author_Number] [int] NOT NULL,
        [Family_Name] [nvarchar](50) NULL,
        [First_Name] [nvarchar](50) NULL,
    )

    INSERT INTO Authors (Client_Id, Project_Id, Person_Id, Author_Number, Family_Name, First_Name)
    VALUES ('Client1','TEST1',12345,1,'Giust','Fede')
    INSERT INTO Authors (Client_Id, Project_Id, Person_Id, Author_Number, Family_Name, First_Name)
    VALUES ('Client1','TEST1',12345,2,'Ma','Ke')
    INSERT INTO Authors (Client_Id, Project_Id, Person_Id, Author_Number, Family_Name, First_Name)
    VALUES ('Client2','TEST2',12346,1,'Jones','Peter')
    INSERT INTO Authors (Client_Id, Project_Id, Person_Id, Author_Number, Family_Name, First_Name)
    VALUES ('Client2','TEST2',12346,2,'Davies','Bob')
    INSERT INTO Authors (Client_Id, Project_Id, Person_Id, Author_Number, Family_Name, First_Name)
    VALUES ('Client3','TEST3',12346,3,'Richards','Craig')
这是脚本

DECLARE @colsPivot AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

select @colsPivot = STUFF((SELECT ',' + QUOTENAME(c.col + '_'+cast(Author_Number as varchar(10))) 
                    from Authors
                    cross apply
                    (
                       select CAST(Person_Id AS VARCHAR(10)) col 
                    ) c

            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')


set @query 
  = 'select Client_id,  '+@colsPivot+' 
      from
      (
        select Client_id,   
          col+''_''+cast(Author_Number as varchar(10)) col, val
        from
        (
          select Client_id, Project_id,
            Person_Id, 
            Author_Number, 
            Family_Name, 
            First_Name
          from Authors
        ) s
        unpivot
        (
          val
          for col in (Project_id)
        ) u
      ) x1
      pivot
      (
        max(val)
        for col in ('+ @colspivot +')
      ) p'

PRINT @query
exec(@query)

我不知道脚本有什么问题。在客户端Id列之后显示的值为空

请尝试此查询。我更新了它

DECLARE @colsPivot AS NVARCHAR(MAX),
@query  AS NVARCHAR(MAX)

select @colsPivot = STUFF((SELECT ',' + QUOTENAME(c.col + '_'+cast(Author_Number as varchar(10))) 
                from Authors
                cross apply
                (
                   select CAST(Person_Id AS VARCHAR(10)) col 
                ) c

        FOR XML PATH(''), TYPE
        ).value('.', 'NVARCHAR(MAX)') 
    ,1,1,'')


set @query   = 'select Client_id,  '+@colsPivot+' 
  from
  (
    select Client_id,   
      cast(Person_id as varchar(10))+''_''+cast(Author_Number as varchar(10)) col, val
    from
    (
      select Client_id, Project_id,
        Person_Id, 
        Author_Number, 
        Family_Name, 
        First_Name
      from Authors
    ) s
    unpivot
    (
      val
      for col in (Project_id)
    ) u
  ) x1
  pivot
  (
    max(val)
    for col in ('+ @colspivot +')
  ) p'

PRINT @query
exec(@query)
以上查询的输出为:

Client_id   12345_1 12345_2 12346_1 12346_2 12346_3
----------------------------------------------------------
Client1          TEST1  TEST1   NULL    NULL    NULL
Client2          NULL   NULL    TEST2   TEST2   NULL
Client3          NULL   NULL    NULL    NULL    TEST3

我的名声不足以使你得胜。我一拿到15分就做了。非常感谢你。