2013-03-20 4 views
1

Je dois transposer mes lignes dans les colonnes d'une DB2 table.This est comment ma table est structurée ..dans DB2 Pivotant

ItemID Item Value 
--------------------- 
1  Meeting  Now 
1  Advise  Yes 
1  NoAdvise No 
2  Meeting  Never 
2  Advise  No 
2  NoAdvise Null 
2  Combine Yes 

Je veux que ce soit transposée dans (note que je ne veux pas Combiner transposant)

ItemID Meeting Advise NoAdvise 
--------------------------------------- 
1   Now  Yes  No 
2   Never No  Null 

Bit aux prises avec la requête, pouvez-vous s'il vous plaît aider?

Répondre

1

Ce n'est pas très joli, mais il devrait fonctionner. DB2 n'a pas de fonction PIVOT intégrée, comme SQL Server.

SELECT DISTINCT 
    A.ItemID 
    ,(SELECT value 
     FROM table B 
     WHERE B.ItemID = A.ItemID 
     AND B.Item = 'Meeting' 
    ) AS Meeting 
    ,(SELECT value 
     FROM table B 
     WHERE B.ItemID = A.ItemID 
     AND B.Item = 'Advise' 
    ) AS Advise 
    ,(SELECT value 
     FROM table B 
     WHERE B.ItemID = A.ItemID 
     AND B.Item = 'NoAdvise' 
    ) AS NoAdvise 
FROM table A 
0

Comme @bhamby dit, DB2 ne dispose pas d'une fonction PIVOT.
La plupart du temps, ma requête diffère seulement dans la façon dont les résultats sont récupérés - vous auriez besoin pour exécuter le profileur/optimiseur sur eux pour être sûr, mais je crois que les sous-requêtes corrélées peuvent être exécutées par ligne (potentiellement moins efficace), plutôt que comme des ensembles. Ceci est peu susceptible d'être un problème sur de petits ensembles de données.

WITH Item (id) as (SELECT DISTINCT itemId 
        FROM YourTable), 
SELECT item.id, Meeting.meeting, Advise.advise, NoAdvise.noadvise 
FROM Item 
LEFT JOIN (SELECT itemId, value as meeting 
      FROM YourTable 
      WHERE item = 'Meeting') as Meeting 
     ON Meeting.itemId = Item.id 
LEFT JOIN (SELECT itemId, value as advise 
      FROM YourTable 
      WHERE item = 'Advise') as Advise 
     ON Advise.itemId = Item.id 
LEFT JOIN (SELECT itemId, value as noadvise 
      FROM YourTable 
      WHERE item = 'NoAdvise') as NoAdvise 
     ON NoAdvise.itemId = Item.id 

(... En fait, je suis un peu inquiet que vous avez des colonnes pour les deux « conseils » et « sans conseiller », qui semble être une sorte de condition booléenne - à savoir, vous devriez avoir un, mais pas l'autre).

1

Le currently accepted answer by bhamby est certainement correct, mais il vaut la peine de vérifier if using several correlated subqueries is much slower than a single group by (indice: le plus probable est):

SELECT 
    A.ItemID, 
    MAX(CASE WHEN A.Item = 'Meeting' THEN Value END) AS Meeting, 
    MAX(CASE WHEN A.Item = 'Advise' THEN Value END) AS Advise, 
    MAX(CASE WHEN A.Item = 'NoAdvise' THEN Value END) AS NoAdvise 
FROM A 
GROUP BY A.ItemID 

Il est aussi un peu plus simple à mon avis

SQLFiddle (dans PostgreSQL, mais des œuvres sur DB2 LUW ainsi)