如何将行值PIVOT到SQL Server中的列

时间:2018-01-27 16:53:44

标签: sql sql-server

如何将行值从ProductType转动或以某种方式转换为新列的名称,并计算按TimeId分组的每种产品类型的金额

这是我的表:

TimeId  ProductType NetIncomeByProduct
---------------------------------------
2017121500  Casino  0.000000
2017121501  Casino  0.000000
2017121502  Casino  4.333282
2017121503  Casino  0.000000
2017121504  Casino  0.000000
2017121505  Casino  0.000000
2017121506  Casino  -0.308172
2017121507  Casino  -0.154086
2017121508  Casino  0.000000
2017121509  Casino  0.000000
2017121510  Casino  0.000000
2017121511  Casino  -0.308172
2017121512  Casino  0.000000
2017121513  Casino  0.000000
2017121514  Casino  0.000000
2017121515  Casino  0.000000
2017121516  Casino  0.000000
2017121517  Casino  0.000000
2017121518  Casino  0.000000
2017121519  Casino  0.000000
2017121520  Casino  0.000000
2017121521  Casino  0.000000
2017121522  Casino  0.000000
2017121523  Casino  0.000000
2017121523  Live Dealer 0.000000
2017121522  Live Dealer 0.000000
2017121521  Live Dealer 0.000000
2017121520  Live Dealer 0.000000
2017121519  Live Dealer 0.000000
2017121518  Live Dealer 0.000000
2017121517  Live Dealer 0.000000
2017121516  Live Dealer 0.000000
2017121515  Live Dealer 0.000000
2017121514  Live Dealer 0.000000
2017121513  Live Dealer 0.000000
2017121512  Live Dealer 0.000000
2017121511  Live Dealer -0.308172
2017121510  Live Dealer 0.000000
2017121509  Live Dealer 0.000000
2017121508  Live Dealer 0.000000
2017121507  Live Dealer -0.154086
2017121506  Live Dealer -0.308172
2017121505  Live Dealer 0.000000
2017121504  Live Dealer 0.000000
2017121503  Live Dealer 0.000000
2017121502  Live Dealer 4.333282
2017121501  Live Dealer 0.000000
2017121500  Live Dealer 0.000000

所以我想要的就是举个例子 TimeId Casino Livedealer在标题中,但我不知道我将拥有多少种产品类型以及每种产品类型都计算了NetIncomeByProduct

一个例子是:

TimeId       Casino      Livedealer 
----------------------------------
2017121502   4.333282    0.0000

1 个答案:

答案 0 :(得分:1)

所以对我的问题的正确答案是:

DECLARE @cols AS NVARCHAR(MAX),
                    @query  AS NVARCHAR(MAX);

                SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(t.ProductType) 
                            FROM #TempTableNetIncomeByProduct t
                            FOR XML PATH(''), TYPE
                            ).value('.', 'NVARCHAR(MAX)') 
                        ,1,1,'')

                set @query = 'SELECT TimeId, ' + @cols + ' from 
                            (
                                select TimeId
                                    , NetIncomeByProduct
                                    , ProductType
                                from #TempTableNetIncomeByProduct
                           ) x
                            pivot 
                            (
                                 max(NetIncomeByProduct)
                                for ProductType in (' + @cols + ')
                            ) p 
                            ORDER BY TimeId'


                execute(@query)

我桌上的结果是:

TimeId  Casino  Live Dealer
2017121500  0.000000    0.000000
2017121501  0.000000    0.000000
2017121502  4.333282    -0.154086
2017121503  0.000000    0.000000
2017121504  0.000000    0.000000
2017121505  0.000000    0.000000
2017121506  0.000000    -0.308172
2017121507  0.000000    -0.154086
2017121508  0.000000    0.000000
2017121509  0.000000    0.000000
2017121510  0.000000    0.000000
2017121511  0.000000    -0.308172
2017121512  0.000000    0.000000
2017121513  0.000000    0.000000
2017121514  0.000000    0.000000
2017121515  0.000000    0.000000
2017121516  0.000000    0.000000
2017121517  0.000000    0.000000
2017121518  0.000000    0.000000
2017121519  0.000000    0.000000
2017121520  0.000000    0.000000
2017121521  0.000000    0.000000
2017121522  0.000000    0.000000
2017121523  0.000000    0.000000