动态地旋转表格

时间:2013-03-06 03:56:02

标签: sql sql-server sql-server-2008 tsql

我有一个类似于以下的表结构:

CREATE TABLE #temp
(
    period_id INTEGER ,
    lease_id  INTEGER  ,
    charge_id VARCHAR(20) ,
    charge_amount MONEY
)

INSERT INTO #temp
        ( period_id ,
          lease_id ,
          charge_id ,
          charge_amount
        )
VALUES  ( 100 , -- period_id - integer
          2000 , -- lease_id - integer
          '300' , -- charge_id - varchar(20)
          12345  -- charge_amount - money
        ) ,
        ( 101 , -- period_id - integer
          2000 , -- lease_id - integer
          '300' , -- charge_id - varchar(20)
          678910  -- charge_amount - money
        ) ,
        ( 101 , -- period_id - integer
          2002 , -- lease_id - integer
          '300' , -- charge_id - varchar(20)
          78950  -- charge_amount - money
        ) ,
        ( 101 , -- period_id - integer
          2002 , -- lease_id - integer
          '310' , -- charge_id - varchar(20)
          9002  -- charge_amount - money
        )

Table structure

我想要一个如下所示的输出:

Example final output

我相信我可以通过创建一系列cte并不断回顾源表来实现这一目标,但我不认为这是一个很好的解决方案,因为我有很多这些费用代码和新的预期将来添加(并且每次发生这种情况时都必须更新查询,这将是一种可怕的做法)。我已经研究了枢轴功能,但我不明白如何使用它,我想了解如何在这种情况下应用它,所以我可以将它添加到我的武器库中。

2 个答案:

答案 0 :(得分:1)

试试这个:

Select period_id,lease_id,[300] as charge_300, [310] as Charge_310
FROM
(Select period_id,lease_id,charge_id,charge_amount 
 from #temp )p
pivot
(
 sum(charge_amount)
 FOR charge_id in ([300],[310])
) as PVT

SQLFIDDLE演示

如果您想要动态PIVOT,其中列数不固定,请尝试以下查询

DECLARE @columns VARCHAR(8000)

SELECT 
@columns = 
COALESCE
(
 @columns + ',[' + charge_id + ']',
 '[' + charge_id + ']'
)
FROM 
#temp 
group by charge_id

// The above query tries to create distinct charge_id as the columns
// @columns= [300],[301]

DECLARE @query VARCHAR(8000)
SET @query = 'SELECT *
FROM
(
 SELECT 
 period_id,lease_id ,charge_id,charge_amount 
 FROM 
 #temp 
) P
PIVOT
(
 SUM(charge_amount) 
 FOR charge_id in (' + @columns + ')
) AS PVT'

 EXECUTE (@query)
 GO

答案 1 :(得分:1)

Understanding PIVOT function in T-SQL

这应该对你有所帮助。它谈到了静态和动态的支点。我想,动态支点在您当前的情况下更合适,因为您的列可能会不断变化。