2012-12-05 59 views
-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 

我需要的數據是這樣的轉換SQLSERVER的數據透視表

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

我需要把結果在asp.net gridview的編輯

我用下面的腳本: 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

+0

越來越封閉0.03秒 –

+0

向我們展示一些代碼,你嘗試過這麼遠嗎? – bUKaneer

+0

@АртёмЦарионов給新用戶一些時間來改進和學習,給他一些幫助以改進它。 – Aristos

回答

0

既然你想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 Fiddle with Demo

結果:

| ACCOUNT | SECTOR1_AMOUNT_CURRENCY1 | SECTOR1_AMOUNT_CURRENCY2 | SECTOR2_AMOUNT_CURRENCY1 | SECTOR2_AMOUNT_CURRENCY2 | 
------------------------------------------------------------------------------------------------------------------------ 
| account1 |      100 |      200 |      150 |      250 | 
| account2 |      250 |      300 |      90 |      180 | 
+0

這很好,我有一個問題, 有無論如何添加ID,因爲我需要更新操作? 謝謝 – Abady

+0

@ user1450667你將會遇到的問題是,如果你添加了id,'pivot'將不會工作,特別是因爲你每個記錄有不同的id。 – Taryn