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 を作成し、常にソース テーブルを参照することでそこにたどり着くことができると確信していますが、これらの請求コードがたくさんあり、新しいコードが追加されることが予想されるため、ここではそれが優れたソリューションではないと思います。将来 (そして、これが発生するたびにクエリを更新する必要があるのはひどい習慣です)。ピボット機能を調べましたが、使い方がわかりません。このシナリオでの適用方法を理解したいので、これを武器庫に追加できます。

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 に答える