2009-07-08 2 views
1

난에서 데이터를 검색하고 데이터베이스는이피벗 해제 연합 대 쿼리 2008

표와 같은 테이블 구조가 있습니다 ClientSales

ClientSalesId     int identity (1, 1) (PK) 
ClientId      int (FK) 
TermId      int (FK) 
StudentType1Population  int 
StudentType1Adjustment  int 
StudentType1Sales    int 
StudentType1SalesAdjustment int 
StudentType2Population  int 
StudentType2Adjustment  int 
StudentType2Sales    int 
StudentType2SalesAdjustment int 
StudentType3Population  int 
StudentType3Adjustment  int 
StudentType3Sales    int 
StudentType3SalesAdjustment int 
StudentType4Population  int 
StudentType4Adjustment  int 
StudentType4Sales    int 
StudentType4SalesAdjustment int 
StudentType5Population  int 
StudentType5Adjustment  int 
StudentType5Sales    int 
StudentType5SalesAdjustment int 

내가 보고서에 피봇 표시 할 필요를 클라이언트 ID = 1 기간 이드

다음과 같이 = 1

 
       Population PopulationAdjustment Sales SalesAdjustment 
StudentType1 313   18     123 22 
StudentType2 233   14     156 33 
StudentType3 234   12     112 41 
StudentType4 233   13     198 29 
StudentType5 343   10     134 36 

,617 , 가장 좋은 방법은

  • 나는 UNPIVOT 또는 UNION
  • 를 사용한다 :

    나는이 두 가지 방법으로 할 수

    
    SELECT 
         'StudentType1'    as DemographicType 
         StudentType1Population  as Population, 
         StudentType1Adjustment  as PopulationAdjustment, 
         StudentType1Sales   as Sales, 
         StudentType1SalesAdjustment as SalesAdjustment, 
    FROM ClientSales 
    WHERE 1=1 
         AND ClientId = 1 
         AND TermId = 1 
    
    UNION 
    
    SELECT 
         'StudentType2'    as DemographicType 
         StudentType2Population  as Population, 
         StudentType2Adjustment  as PopulationAdjustment, 
         StudentType2Sales   as Sales, 
         StudentType2SalesAdjustment as SalesAdjustment, 
    FROM ClientSales 
    WHERE 1=1 
         AND ClientId = 1 
         AND TermId = 1 
    
    -- yada yada yada for the rest of the types........... 
    

    또는

    
    SELECT 
         ClientId, 
         Population 
    FROM 
    (
         SELECT 
           ClientId, 
           StudentType1Population, 
           StudentType2Population, 
           StudentType3Population, 
           StudentType4Population, 
           StudentType5Population 
         FROM ClientSales 
    ) PVTPopulation 
    UNPIVOT 
    (
         Population for StudentType IN 
         (
           StudentType1Population, 
           StudentType2Population, 
           StudentType3Population, 
           StudentType4Population, 
           StudentType5Population 
         ) 
    ) as UnPvtPopulation 
    
    INNER JOIN 
    
    (
         SELECT 
           ClientId, 
           StudentType1PopulationAdjustment, 
           StudentType2PopulationAdjustment, 
           StudentType3PopulationAdjustment, 
           StudentType4PopulationAdjustment, 
           StudentType5PopulationAdjustment 
         FROM ClientSales 
    ) PVTPopulation 
    UNPIVOT 
    (
         PopulationAdjustment for StudentType IN 
         (
           StudentType1PopulationAdjustment, 
           StudentType2PopulationAdjustment, 
           StudentType3PopulationAdjustment, 
           StudentType4PopulationAdjustment, 
           StudentType5PopulationAdjustment 
         ) 
    ) as UnPvtPopulationAdjustment 
    
         ON UnPvtPopulationAdjustment.ClientSalesId = UnPvtPopulation.ClientSalesId 
         AND REPLACE (UnPvtPopulationAdjustment.StudentType, 'PopulationAdjustment', '') = REPLACE (UnPvtPopulation.StudentType, 'Population', '') 
    
    INNER JOIN 
    
    (
         SELECT 
           ClientId, 
           StudentType1Sales, 
           StudentType2Sales, 
           StudentType3Sales, 
           StudentType4Sales, 
           StudentType5Sales 
         FROM ClientSales 
    ) PVTSales 
    UNPIVOT 
    (
         Sales for StudentType IN 
         (
           StudentType1Sales, 
           StudentType2Sales, 
           StudentType3Sales, 
           StudentType4Sales, 
           StudentType5Sales 
         ) 
    ) as UnPvtSales 
    
         ON UnPvtSales.ClientSalesId = UnPvtPopulation.ClientSalesId 
         AND REPLACE (UnPvtSales.StudentType, 'Sales', '') = REPLACE (UnPvtPopulation.StudentType, 'Population', '') 
    

    그래서 여기는 질문 있습니다

  • 이 언 피봇을 쓰는 더 좋은 방법이 있습니까?

답변

5

가 나는 UNPIVOT 그냥 절은 .. 당신이 필요한만큼 사용할 수 있습니다 어디 같은 것을 발견

SELECT Col1, Col2, Unp1, Unp2, Unp3 
FROM TBL 
UNPIVOT (XX For Unp1 (ColXX1, ColXX2)) 
UNPIVOT (YY For Unp2 (ColYY1, ColYY2)) 
UNPIVOT (ZZ For Unp2 (ColZZ1, ColZZ2))