0

行ではなく別の列で結果を取得する動的ピボット テーブルを作成しようとしています。

これは私がテストに使用しているテーブルです

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 ('TEST','TEST',12345,1,'Giust','Fede')
INSERT INTO Authors (Client_Id, Project_Id, Person_Id, Author_Number, Family_Name, First_Name)
VALUES ('TEST','TEST',12345,2,'Giust','Fede')
INSERT INTO Authors (Client_Id, Project_Id, Person_Id, Author_Number, Family_Name, First_Name)
VALUES ('TEST','TEST',12346,1,'Giust','Fede')
INSERT INTO Authors (Client_Id, Project_Id, Person_Id, Author_Number, Family_Name, First_Name)
VALUES ('TEST','TEST',12346,2,'Giust','Fede')
INSERT INTO Authors (Client_Id, Project_Id, Person_Id, Author_Number, Family_Name, First_Name)
VALUES ('TEST','TEST',12346,3,'Giust','Fede')

これまでのところ、このような結果が得られます

CLIENT_ID   PROJECT_ID  PERSON_ID   AUTHOR_NUMBER   FAMILY_NAME FIRST_NAME
TEST        TEST        12345       1               Giust       Fede
TEST        TEST        12345       2               Ma          Ke
TEST        TEST        12346       1               Jones       Peter
TEST        TEST        12346       2               Davies      Bob
TEST        TEST        12346       3               Richards        Craig

結果がこのように出てくる必要があり、動的であることが必要です。なぜなら、著者が 2 人または 10 人いる場合があるからです。

CLIENT_ID   PROJECT_ID  PERSON_ID   FAMILY_NAME_1   FIRST_NAME_1    FAMILY_NAME_2   FIRST_NAME_2        FAMILY_NAME_3   FIRST_NAME_3      
TEST        TEST        12345       Giust           Fede            Ma              Ke

TEST        TEST        12346       Jones           Peter           Davies          Bob                 Richards            Craig

このコードを使用しようとしていますが、エラーが発生し続けます

SQL フィドル

4

1 に答える 1

0

問題を解決するためのいくつかの提案を次に示します。

まず、現在のコードはテーブル内のすべての列のピボットを解除しています。列Family_NameFirst_Name列のピボットを解除するだけで済みます。その結果、変数を使用してこの列のリストを取得することはせず、アンピボットする必要がある 2 つの列をハードコードするだけです。

次に、列のリストを PIVOT に取得するには、コードを変更しAuthor_numberて、 と列名Family_Nameを含む文字列を使用しFirst_Nameます。

select @colsPivot = STUFF((SELECT ',' + QUOTENAME(c.col + '_'+cast(Author_Number as varchar(10))) 
                    from Authors
                    cross apply
                    (
                      select 'Family_Name' col, 1 so union all
                      select 'First_Name', 2
                    ) c
                    group by col, author_number, so
                    order by author_number, so
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

これにより、列のリストが得られます。

|                                                                                     COLUMN_0 |
------------------------------------------------------------------------------------------------
| [Family_Name_1],[First_Name_1],[Family_Name_2],[First_Name_2],[Family_Name_3],[First_Name_3] |

コードにこれらの変更を加えると、最終的なクエリは次のようになります

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 'Family_Name' col, 1 so union all
                      select 'First_Name', 2
                    ) c
                    group by col, author_number, so
                    order by author_number, so
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')


set @query 
  = 'select Client_id, Project_id, Person_Id, '+@colsPivot+' 
      from
      (
        select Client_id, Project_id, Person_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 (Family_Name, First_Name)
        ) u
      ) x1
      pivot
      (
        max(val)
        for col in ('+ @colspivot +')
      ) p'

exec(@query)

SQL Fiddle with Demoを参照してください。これにより、次の結果が得られます。

| CLIENT_ID | PROJECT_ID | PERSON_ID | FAMILY_NAME_1 | FIRST_NAME_1 | FAMILY_NAME_2 | FIRST_NAME_2 | FAMILY_NAME_3 | FIRST_NAME_3 |
-----------------------------------------------------------------------------------------------------------------------------------
|      TEST |       TEST |     12345 |         Giust |         Fede |            Ma |           Ke |        (null) |       (null) |
|      TEST |       TEST |     12346 |         Jones |        Peter |        Davies |          Bob |      Richards |        Craig |
于 2013-05-28T14:53:42.790 に答える