3

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

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
        )

表结构

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

示例最终输出

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

4

2 回答 2

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
于 2013-03-06T04:57:22.947 回答
1

了解 T-SQL 中的 PIVOT 函数

这应该可以帮助你。它谈论静态和动态枢轴。我想,动态枢轴会更适合您当前的情况,因为您的列可能会不断变化。

于 2013-03-06T05:02:04.270 回答