2010-03-20 2 views
1

J'ai une table KVP et la structure est ID, clé, valeur.J'ai une table de paires de valeurs clé KVP, Besoin de sql pour rendre la structure relationnelle ...!

Voici quelques exemples de valeurs ...

ID, KEY,  VALUE 
--------------------- 
1, STATUS, TRUE 
1, AGE GROUP, 10 
1, TRAVEL, Y 
2, STATUS, FALSE 
2, AGE GROUP, 20 
2, TRAVEL, N 

Je veux que ces valeurs soient transformées comme ci-dessous ...

ID, STATUS, AGE GROUP, TRAVEL 
------------------------------ 
1, TRUE, 10,  Y 
2, FALSE, 20,  N 

J'ai lu sur crosstab/pivot, mais je suis pas en mesure de faire une requête qui peut me donner la sortie ci-dessus. Y a-t-il un moyen en SQL pour que ma sortie ressemble à l'exemple ci-dessus?

+0

sont les colonnes, ID, STATUT, GROUPE D'ÂGE, sont toujours TRAVEL fixes ou ils sont dynamiques .... Si elles sont dynamiques nous dois aller avec SQL dynamique qui sera lent .... –

+0

Ya sa dynamique, mais j'ai une option pour construire à partir de Java et exécuter la requête ... –

+0

Quel système SQL utilisez-vous? –

Répondre

0

Il y a probablement des optimisations, mais cela fonctionne (testé dans SQLite et MySQL)

select stat.id as id, status, age_group, travel from 
(select id, Value as status from kvp 
where Key = 'STATUS') as stat JOIN 
(select id, Value as age_group from kvp 
where Key = 'AGE GROUP') as age on stat.id = age.id JOIN 
(select id, Value as travel from kvp 
where Key = 'TRAVEL') as trav on stat.id = trav.id; 

modifié pour corriger une ambiguïté.

+0

Merci cela a fonctionné ... –

2

En supposant Oracle basé sur l'étiquette, puis

SELECT DISTINCT id 
    , MAX(CASE key WHEN 'STATUS' THEN value ELSE null END) OVER (PARTITION BY id) status 
    , MAX(CASE key WHEN 'AGE GROUP' THEN value ELSE null END) OVER (PARTITION BY id) age_grp 
    , MAX(CASE key WHEN 'TRAVEL' THEN value ELSE null END) OVER (PARTITION BY id) travel 
FROM kvp 
ORDER BY id; 
+0

Merci cela a fonctionné ... mais il a CAS, PARTITION, etc ,. Je voulais un sql pur. –

0
select 
    min(decode(KEY, 'ID',  VALUE, null)) ID, 
    min(decode(KEY, 'STATUS', VALUE, null)) STATUS, 
    min(decode(KEY, 'AGE GROUP', VALUE, null)) AGE_GROUP, 
    min(decode(KEY, 'TRAVEL', VALUE, null)) TRAVEL 
from 
    KVP 
Questions connexes