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

je besoin de données pour être comme çadonnées SQLServer Convertir table Pivot

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

je dois mettre le résultat en asp.net gridview modifier

J'utilise le script suivant : 1- pour obtenir des colonnes:

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- pivot:

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) 

le problème, j'ai 2 champs qui doivent pivoter, amount_currency1 et amount_currency2

+0

se fermé en 0,03 secondes –

+0

nous Afficher un code, qu'avez-vous essayé jusqu'à présent? – bUKaneer

+0

@ АртёмЦарионов Donnez du temps au nouvel utilisateur pour l'améliorer et l'apprendre, donnez-lui de l'aide pour l'améliorer. – Aristos

Répondre

0

Puisque vous essayez de PIVOT sur deux valeurs, vous devez d'abord UNPIVOT les AMOUNT_CURRENCY1 et AMOUNT_CURRENCY2 colonnes:

Vous allez voulez ajouter quelque chose comme ceci à votre requête:

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 

Ensuite, votre requête finale sera semblable à ceci:

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) 

Voir SQL Fiddle with Demo

Résultat:

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

Cela fonctionne très bien, j'ai une question, Y at-il de toute façon d'ajouter un ID, parce que je l'ai besoin pour l'opération de mise à jour? Merci – Abady

+0

@ user1450667 le problème que vous aurez est que le 'pivot' ne fonctionnera pas de la même façon si vous ajoutez l'identifiant, d'autant plus que vous avez des identifiants différents par enregistrement. – Taryn