T-SQL Pivot Tables(行列转换) in SQL Server 2005/2008

T-SQL Pivot Syntax

SELECT

  [non-pivoted column], -- optional

  [additional non-pivoted columns], -- optional

  [first pivoted column],

  [additional pivoted columns]

FROM (

  SELECT query producing sql data for pivot

  -- select pivot columns as dimensions and

  -- value columns as measures from sql tables

) AS TableAlias

PIVOT

(

  <aggregation function>(column for aggregation or measure column) -- MIN,MAX,SUM,etc

  FOR [<column name containing values for pivot table columns>]

  IN (

    [first pivoted column], ..., [last pivoted column]

  )

) AS PivotTableAlias

ORDER BY clause -- optional

T-SQL Pivot Table Examples in AdventureWorks SQL Server sample database

select

  PS.Name, P.Color, PIn.Quantity

from Production.Product P

inner join Production.ProductSubcategory PS

  on PS.ProductSubcategoryID = P.ProductSubcategoryID

left join Production.ProductInventory PIn

  on P.ProductID = PIn.ProductID

 

 

 

ExpandedBlockStart.gif 代码
  1  use  AdventureWorks
  2  go
  3  -- -geovindu@163.com  涂聚文
  4  select
  5     *
  6  from
  7  (
  8     select
  9      PS.Name, P.Color, PIn.Quantity
 10     from  Production.Product P
 11     inner   join  Production.ProductSubcategory PS
 12       on  PS.ProductSubcategoryID  =  P.ProductSubcategoryID
 13     left   join  Production.ProductInventory PIn
 14       on  P.ProductID  =  PIn.ProductID
 15  ) DataTable
 16  PIVOT
 17  (
 18  -- ISNULL(NULLIF(d,0)
 19     SUM (Quantity))
 20     FOR  Color
 21     IN  (
 22       [ Black ] , [ Blue ] , [ Grey ] , [ Multi ] , [ Red ] ,
 23       [ Silver ] , [ Silver/Black ] , [ White ] , [ Yellow ]
 24    )
 25  ) PivotTable
 26 
 27  --
 28  SELECT   *
 29  FROM  (
 30     SELECT
 31       YEAR (OrderDate)  [ Year ] ,
 32       MONTH (OrderDate)  [ Month ] ,
 33      SubTotal
 34     FROM  Sales.SalesOrderHeader
 35  ) TableDate
 36  PIVOT (
 37     SUM (SubTotal)
 38     FOR   [ Month ]   IN  (
 39       [ 1 ] , [ 2 ] , [ 3 ] , [ 4 ] , [ 5 ] , [ 6 ] , [ 7 ] , [ 8 ] , [ 9 ] , [ 10 ] , [ 11 ] , [ 12 ]
 40    )
 41  ) PivotTable
 42 
 43  --
 44  SELECT   *
 45  FROM  (
 46     SELECT
 47       YEAR (OrderDate)  [ Year ] ,
 48       CASE   MONTH (OrderDate)
 49         WHEN   1   THEN   ' January '
 50         WHEN   2   THEN   ' February '
 51         WHEN   3   THEN   ' March '
 52         WHEN   4   THEN   ' April '
 53         WHEN   5   THEN   ' May '
 54         WHEN   6   THEN   ' June '
 55         WHEN   7   THEN   ' July '
 56         WHEN   8   THEN   ' August '
 57         WHEN   8   THEN   ' September '
 58         WHEN   8   THEN   ' October '
 59         WHEN   8   THEN   ' November '
 60         WHEN   8   THEN   ' December '
 61       END   as   [ Month ] ,
 62      SubTotal
 63     FROM  Sales.SalesOrderHeader
 64  ) TableDate
 65  PIVOT (
 66     SUM (SubTotal)
 67     FOR   [ Month ]   IN  (
 68       [ January ] , [ February ] , [ March ] , [ April ] ,
 69       [ May ] , [ June ] , [ July ] , [ August ] ,
 70       [ September ] , [ October ] , [ November ] , [ December ]
 71    )
 72  ) PivotTable
 73 
 74  -- -
 75 
 76  SELECT   *
 77  FROM (
 78     SELECT
 79       YEAR (DueDate)  [ Year ] ,
 80       CASE   MONTH (DueDate)
 81         WHEN   1   THEN   ' January '
 82         WHEN   2   THEN   ' February '
 83         WHEN   3   THEN   ' March '
 84         WHEN   4   THEN   ' April '
 85         WHEN   5   THEN   ' May '
 86         WHEN   6   THEN   ' June '
 87         WHEN   7   THEN   ' July '
 88         WHEN   8   THEN   ' August '
 89         WHEN   9   THEN   ' September '
 90         WHEN   10   THEN   ' October '
 91         WHEN   11   THEN   ' November '
 92         WHEN   12   THEN   ' December '
 93       END   as   [ Month ] ,
 94      ProductID,
 95      OrderQty
 96     FROM  Production.WorkOrder
 97  ) WorkOrders
 98  PIVOT
 99  (
100     SUM (OrderQty)
101     FOR   [ Month ]   IN  (
102       [ January ] , [ February ] , [ March ] , [ April ] ,
103       [ May ] , [ June ] , [ July ] , [ August ] ,
104       [ September ] , [ October ] , [ November ] , [ December ]
105    )
106  AS  PivotTable
107  ORDER   BY   [ Year ] , ProductID
108 
109  -- -
110  DECLARE   @PivotColumnHeaders   VARCHAR ( MAX )
111  SELECT   @PivotColumnHeaders   =
112     COALESCE (
113       @PivotColumnHeaders   +   ' ,[ '   +   cast (Name  as   varchar +   ' ] ' ,
114       ' [ '   +   cast (Name  as   varchar ) +   ' ] '
115    )
116  FROM  Sales.SalesTerritory
117 
118  DECLARE   @PivotTableSQL   NVARCHAR ( MAX )
119  SET   @PivotTableSQL   =  N '
120    SELECT *
121    FROM (
122      SELECT
123        YEAR(H.OrderDate) [Year],
124        T.Name,
125        H.TotalDue
126      FROM Sales.SalesOrderHeader H
127      LEFT JOIN Sales.SalesTerritory T
128        ON H.TerritoryID = T.TerritoryID
129    ) AS PivotData
130    PIVOT (
131      SUM(TotalDue)
132      FOR Name IN (
133         '   +   @PivotColumnHeaders   +   '
134      )
135    ) AS PivotTable
136  '
137 
138  EXECUTE ( @PivotTableSQL )

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值