1

次のテーブルがあります:
1 UNIT_OF_MEASURE.: 列: UNIT_OF_MEASURE, CODE, DESCRIPTION, VERSION
2 UNIT_OF_MEASURE_TRANS.: 列: UNIT_OF_MEASURE_ID_LANGAUGE_ID, DESCRIPTION
3 LANGUAGE.: 列:LANGUAGE_ID, LANGUAGE_NAME

私がやろうとしているのは、すべての測定単位の説明を 5 つの言語で表示することです。これは成功しましたが、リストとして、つまり、1 つの列のすべての説明が異なる言語で繰り返されています。

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;

`

ここで、これを改善して、言語に基づいて個別の列に説明の各グループを表示する必要があります。したがって、5 つの列に、異なる言語で同じ単位の説明のグループが含まれるようにします。試してみましたが、デカルト積の結果が得られました。問題が解決するslef-joinかどうかはわかりません。union allここで転置に関するいくつかの投稿を確認しましたが、残念ながら私のケースにはどれも適用できませんでした。

4

2 に答える 2

3

PIVOT をエミュレートするには、CASE、MAX、および 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 フィドル

于 2013-09-04T10:14:20.927 に答える
0

掘り下げた後、同様の質問が多数見つかります。体系的に答えを次のように述べることができます
。1.列を行に転置するには、 ここUNION ALL
使用 できます
. Oracle 11g:ビルトイン PIVOT 機能を使用できます。ここでは
b. Oracle 10g および 9i:[CASE WHEN][4]式または[DECODE][5]式の使用が制限されています。c. Oracle 8i:DECODE式 の使用が制限されています

上記の私の質問に対して、次のような解決策を見つけました。

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;

CASE WHEN式では、集計関数を使用しないと、式を削除しない限りエラーが発生することに注意してくださいGROUP BY。ただし、後者の場合、ほとんど有用な結果ではないすべての null 値を取得します。

于 2013-09-04T11:58:49.063 に答える