行转列
UNPIVOT 操作符说明
简而言之,UNPIVOT操作符就是取得一个行的数据集合,然后把每一行都转换成多个行数据。为了更好地理解,请看下图:
图1
从上图中,你能发现UNPOVOT操作符,取得了两行数据,每行包含三个Price值,然后将这些转化成6行数据,其中每个产品价格都是一个不同的行。
UNPIVOT 命令制定了两个不同的列类型。第一个类型是列中不被转换的。在例子中,ID、产品名字列是这样的列类型。第二种列类型就是那些被转换的。诸如ProductCode, Wholesale 和Retail 这三列。在我上面的例子中,那些没有被转换的列将被在每套列值集合中重复,而另外的那些列将被转换成行。
UNPIVOT 语法
下面就是 UNPIVOT 的语法:
SELECT [columns not unpivoted],
[unpivot_column],
[value_column],
FROM
(<source query>)
AS <alias for the source data>
UNPIVOT ( [value_column] FOR [unpivot_column] IN ( <column_list> ) )
AS <alias for unpivot>
Where:
-
- [columns not unpivoted]: 不被转换的列的名字清单。
- [unpivot_column]: 不转换的列的名称。
- [value_column]: 确定一个列名称来代表不转换的列的数据。
- <source query>: 源数据。
- <alias for the source data>: 为源数据转换后的表确定一个别名。
- <column_list>: 被转换的列的列名称。
- <alias for unpivot>: 为转换操作的整套生产,确定一个别名。
eg:
select ID,ProductName,PurchaseType,Cost from test as test1
unpivot( Cost for PurchaseType IN (ProductCost,Wholesale,Retail)) as trans
select Date,Returnss,ISIN from test_table unpivot
(Returnss for ISIN in (
[abcdefg]) ) as f
order by ISIN, Date
/****** Script for SelectTopNRows command from SSMS ******/
SELECT * FROM (SELECT [AsOfDate]
,[FundCode]
,TimePeriod
,[category]
,CAST (va AS FLOAT) [va]
FROM
(select * from [dbo].[OverviewReturns]) as sourcetable
unpivot(va for category in ([Gross_Annualized]
,[Net_Annualized]
,[Benchmark_1]
,[Benchmark_2]
,[Standard_Deviation]
,[Beta]
,[Correlation]
,[Sharpe]
,[Sortino]
,[Benchmark_1_Standard_Deviation]
,[Benchmark_1_Sharpe]
,[Benchmark_1_Sortino]
,[Benchmark_2_Standard_Deviation]
,[Benchmark_2_Sharpe]
,[Benchmark_2_Sortino]
,[Benchmark_1_Difference]
,[Benchmark_3_Difference])) as a ) as u
pivot(
sum([va]) for u.[TimePeriod] in ([1 Year],[5 Years],[20 Years],[Since Inception]) )as w