【问题标题】:Unpivot vs. Union queries in T-SQL 2008T-SQL 2008 中的 Unpivot 与联合查询
【发布时间】:2009-07-08 19:24:51
【问题描述】:

我从中检索数据的数据库具有这样的表结构

表: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

我必须在报告中显示它,如下所示

对于 ClientId = 1 和 Term Id = 1

人口人口调整销售额销售额调整 学生类型1 313 18 123 22 学生类型2 233 14 156 33 学生类型3 234 12 112 41 学生类型4 233 13 198 29 学生类型5 343 10 134 36

我可以通过两种方式做到这一点


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

以下是问题:

  • 作为最佳实践,我应该使用 UNPIVOT 还是 UNION
  • 有没有更好的方法来编写这个 UNPIVOT?

【问题讨论】:

    标签: sql sql-server tsql unpivot


    【解决方案1】:

    我发现 UNPIVOT 就像 where 子句.. 你可以根据需要使用任意多个

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

    【讨论】:

      猜你喜欢
      • 2012-03-31
      • 1970-01-01
      • 2017-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-28
      相关资源
      最近更新 更多