-2
ID ---- ACCOUNT ---- SECTOR ---- AMOUNT_CURRENCY1 ------ AMOUNT_CURRENCY2
1  --- account1 ---- sector1 --- 100              ------ 200
2  --- account1 ---- sector2 --- 150              ------ 250
3  --- account2 ---- sector1 --- 250              ------ 300
4  --- account2 ---- sector2 --- 90               ------ 180

このようなデータが必要です

               sector1 ------------ sector2
         | amount1 | amount2 |  amount1 | amount2
Account1 | 100     | 200
Account2 | 250     | 250

編集するには、結果をasp.netgridviewに配置する必要があります

私は次のスクリプトを使用しています:1-列を取得するには:

DECLARE @ColumnHeaders VARCHAR(MAX)
SELECT @ColumnHeaders =
  COALESCE(

  @ColumnHeaders + ',[!sector:' + cast(sector_ID as nvarchar)+ ':' + sector_name + ']',
    '[!sector:' + cast(sector_ID as nvarchar)+ ':' + sector_name+ ']'
  )
FROM vw_Transaction
group by sector_ID, sector_name

2-ピボット:

DECLARE @TableSQL NVARCHAR(MAX)
SET @TableSQL = N'
  SELECT *
  FROM (SELECT trans_id, account_name, sector_id, sector_name,
  amount_currency1, amount_currency2, ''!sector:'' + cast(sector_ID as nvarchar)+ '':'' + sector_name as col
FROM         dbo.vw_Transaction 
WHERE 
trans_id=' + CAST(@trans_id as varchar) +'
  ) AS PivotData
  PIVOT (
    MAX(amount_currency1)
    FOR col IN (
      ' + @ColumnHeaders + '
    )
  ) AS PivotTable' 
EXECUTE(@TableSQL)

問題は、ピボットする必要がある2つのフィールド、amount_currency1とamount_currency2があります

4

1 に答える 1

0

2つの値を使用しようとしているため、最初にとの列を作成PIVOTする必要があります。UNPIVOTAMOUNT_CURRENCY1AMOUNT_CURRENCY2

クエリに次のようなものを追加する必要があります。

select account, value, sector+ '_'+col as col
from
(
select sector,
  account,
  AMOUNT_CURRENCY1,
  AMOUNT_CURRENCY2
from vw_Transaction
) src
unpivot
(
value
for col in (AMOUNT_CURRENCY1, AMOUNT_CURRENCY2)
) unpiv

次に、最終的なクエリは次のようになります。

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

select @cols = STUFF((SELECT DISTINCT ',' 
                      + quotename(t.sec+'_'+c.name)
                    from
                    (
                      select sector sec
                      from vw_Transaction
                    ) t
                    cross apply sys.columns as C
                   where C.object_id = object_id('vw_Transaction') and
                         C.name not in ('id', 'account', 'sector')
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')


set @query = 'SELECT account,' + @cols + ' from 
             (
               select account, value,
                  sector+ ''_''+col as col
              from
              (
                select sector,
                  account,
                  AMOUNT_CURRENCY1,
                  AMOUNT_CURRENCY2
                from vw_Transaction
              ) src
              unpivot
              (
                value
                for col in (AMOUNT_CURRENCY1, AMOUNT_CURRENCY2)
              ) unpiv
            ) x
            pivot
            (
              max(value)
              for col in (' + @cols + ')
            ) p '

execute(@query)

SQL FiddlewithDemoを参照してください

結果:

|  ACCOUNT | SECTOR1_AMOUNT_CURRENCY1 | SECTOR1_AMOUNT_CURRENCY2 | SECTOR2_AMOUNT_CURRENCY1 | SECTOR2_AMOUNT_CURRENCY2 |
------------------------------------------------------------------------------------------------------------------------
| account1 |                      100 |                      200 |                      150 |                      250 |
| account2 |                      250 |                      300 |                       90 |                      180 |
于 2012-12-05T19:39:16.737 に答える