2013-09-04 4 views
1

Je les tableaux suivants: 1.
UNIT_OF_MEASURE: colonnes: UNIT_OF_MEASURE, CODE, DESCRIPTION, VERSION
2. UNIT_OF_MEASURE_TRANS: colonnes: UNIT_OF_MEASURE_ID_LANGAUGE_ID, DESCRIPTION
3. LANGUAGE: colonnes: LANGUAGE_ID, LANGUAGE_NAMETransposer les lignes abouti à Oracle 9i

Ce que je J'ai essayé de faire est de montrer toutes les descriptions d'unités de mesures en 5 langues. Je l'ai fait avec succès mais comme une liste, c'est-à-dire, toute la description dans une colonne répétée dans différentes langues.

SELECT 
    uomt.description, 
    l.language_name 
FROM unit_of_measure_trans uomt 
INNER JOIN language l ON (uomt.language_id = l.language_id) 
WHERE 
    l.language_id IN (25, 22, 82, 34, 27, 52, 10, 90) 
order by language_name; 

`

Maintenant, je dois améliorer cela pour montrer chaque groupe de descriptions dans la colonne séparée en fonction de la langue. Donc, cinq colonnes contiendront le même groupe de descriptions d'unités de mesure dans différentes langues. J'ai essayé slef-join mais j'ai obtenu des résultats de produits cartésiens, pas sûr si union all résoudra le problème. J'ai passé en revue plusieurs articles sur la transposition ici, je crains de ne pouvoir en appliquer aucun sur mon cas.

+0

Vous avez besoin de PIVOT. Voir ceci: http: //stackoverflow.com/questions/1677645/using-pivot-in-sql-server-2008? Rq = 1 –

+1

@vijay Je ne pense pas que PIVOT soit disponible en oracle i9. – Hawk

+0

désolé je pensais MS-SQL SERVER. –

Répondre

3

Pour imiter PIVOT, vous pouvez utiliser une combinaison de CASE, MAX et GROUP BY:

SELECT 
    max(case when language_name = 'English' then uomt.description else null end) 
     as english_description, 
    max(case when language_name = 'German' then uomt.description else null end) 
     as german_description, 
    uomt.unit_of_measure_id 
FROM unit_of_measure_trans uomt 
INNER JOIN language l ON (uomt.language_id = l.language_id) 
group by uomt.unit_of_measure_id 
order by uomt.unit_of_measure_id; 

SQL Fiddle

0

Après creuser, nous trouverons de nombreuses questions semblables, je peux dire systemtically la réponse que suivre:
1. afin de transposer des colonnes en lignes, vous pouvez utiliser UNION ALLhere
2. pour appliquer le tableau croisé dynamique, vous devriez considérer version Oracle comme suit:
a. Oracle 11g: Vous pouvez utiliser Built In PIVOT Feature et here
b. Oracle 10g et 9i: Vous êtes limité à utiliser l'expression [CASE WHEN][4] ou l'expression [DECODE][5]. c. Oracle 8i: Vous êtes limité à une utilisation DECODE expression

Pour ma question ci-dessus, j'ai trouvé la solution comme suit:

SELECT uom.code, MAX(CASE WHEN l.language_id = 25 THEN uomt.description ELSE NULL END) AS english, MAX(CASE WHEN l.language_id = 22 THEN uomt.description ELSE NULL END) AS german FROM unit_of_measure uom INNER JOIN unit_of_measure_trans uomt ON (uom.unit_of_measure_id = uomt.unit_of_measure_id) INNER JOIN language l ON (uomt.language_id = l.language_id) WHERE l.language_id IN (25, 22)) GROUP BY uom.code;

Notez que l'expression CASE WHEN, si vous ne l'utilisez pas fonction d'agrégation que vous » Vous obtiendrez une erreur à moins que vous ne supprimiez l'expression GROUP BY. Cependant, dans le dernier cas, vous obtiendrez toutes les valeurs nulles, ce qui est rarement un résultat utile.

Questions connexes