2012-12-05 56 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