2014-04-24 2 views
0

피벗 모드의 테이블에 값을 표시하는 결과를 표시하려고합니다. 그러나 다른 행의 열 이름은 Person_Id와 Author_Number의 조합이며 해당 열의 값은 Project_Id 여야합니다. 두 번째 열에서 등등 및 등등 person_id로 및 Author_Number의 조합이다두 개의 열이있는 피벗이 ms SQL을 결합합니다.

Client_Id 12345_1 12345_2 12346_1 12346_2 12346_1 
Client1  Test1  Test1 
Client2      Test2 Test2 
Client3          Test3 

참고 : 쉽게 이해하기 위해서, 아래의 샘플 결과를 참조하십시오. 여기

는 스크립트

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, '[email protected]+' 
     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) 

나는 문제가 스크립트 무엇인지 알아낼 수 없습니다 샘플 테이블 여기

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') 

입니다. 클라이언트 Id 열 뒤에 표시되는 값이 null

답변

2

이 쿼리를 시도하십시오. 나는 그것을 새롭게했다.

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, '[email protected]+' 
    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 
+0

것은 당신이 또한 upvot 좋아합니다. 덕분에 –

+0

- 고마워요! – user3472262

+0

내 평판은 당신을 업 홀드하기에 충분하지 않습니다. 한번은 평판이 15 번 나옵니다. 고맙습니다. – user3472262

관련 문제