2013-09-04 2 views
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Транспонирования приведенных строк в Oracle 9i

Что я m пытался показать все единицы описаний мер на 5 языках. Я успешно сделал это, но как список, то есть все описания в одном столбце повторяются на разных языках.

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; 

`

Теперь мне нужно улучшить это, чтобы показать каждую группу описаний в отделенной колонке на основе языка. Таким образом, у меня будет пять столбцов, содержащих одну группу описаний единиц измерения на разных языках. Я попробовал slef-join, но у меня были декартовые результаты продукта, не уверен, что union all решит проблему. Я просмотрел несколько сообщений о транспозиции здесь, я боюсь, что не смогу применить их к моему делу.

+0

Что вам нужно, PIVOT. Смотрите: http: //stackoverflow.com/questions/1677645/using-pivot-in-sql-server-2008? Rq = 1 –

+1

@vijay Я не думаю, что PIVOT доступен в oracle i9. – Hawk

+0

жаль, что я думал MS-SQL SERVER. –

ответ

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 Fiddle

0

После выкапывания мы найдем множество подобных вопросов, я могу systemtically сформулировать ответ, следовать:
1. для того, чтобы транспонировать столбцов в строки, вы можете использовать UNION ALLhere
2. для того, чтобы применить сводную таблицу следует рассматривать оракул версию следующим образом:
a. Oracle 11g: вы можете использовать Built In PIVOT Feature и here
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 выражении, если не использовать агрегатную функцию вы» ll получите ошибку, если вы не удалите выражение GROUP BY. Однако в последнем случае вы получите все нулевые значения, которые редко бывают полезными.

Смежные вопросы