2010-08-04 7 views
1

J'ai une table qui stocke des documents comme celui-ci:combiner plusieurs lignes dans le tableau en 1 resultset ligne

name  | stat | value 
-------------------------- 
object1 | stat1 | val1 
object1 | stat2 | val2 
object1 | stat3 | val3 
object1 | stat4 | val4 

Mais je voudrais interroger les données de sorte qu'il renvoie des lignes comme celui-ci

name | stat1| stat2| stat3| stat4 
------------------------------------- 
object1 | val1 | val2 | val3 | val4 

Est-ce que j'utiliserais des déclarations de cas, ou comment accomplir quelque chose comme ça? Mon exemple montre seulement 4 statistiques possibles, mais j'espère que je peux créer quelque chose de suffisamment dynamique où si j'ajoute de nouvelles statistiques dans le futur, la requête n'aura pas à être réécrite. Si ce n'est pas possible, quelles sont mes options?

Répondre

5

requête pivot typique:

SELECT t.name, 
     MAX(CASE WHEN t.stat = 'stat1' THEN t.value ELSE NULL END) AS stat1, 
     MAX(CASE WHEN t.stat = 'stat2' THEN t.value ELSE NULL END) AS stat2, 
     MAX(CASE WHEN t.stat = 'stat3' THEN t.value ELSE NULL END) AS stat3, 
     MAX(CASE WHEN t.stat = 'stat4' THEN t.value ELSE NULL END) AS stat4 
    FROM TABLE t 
GROUP BY t.name 

Etant donné que les valeurs doivent être affectés de manière statique, cette requête doit être convertie en SQL dynamique si vous voulez gérer une situation dynamique - utiliser MySQL's Prepared Statement syntax pour SQL dynamique ..

+0

Merci. Cela fonctionne magnifiquement. – Nathan

Questions connexes