2016-07-07 6 views
2

Следующий шаг от here:SQL Select - объединить две таблицы (при преобразовании строк в столбцах)

На базе Informix (без опции поворота), я ищу динамично трансформировать следующие таблицы с помощью SQL:

Первая таблица: "каталог"

 
book  | info | value 
----------------------------- 
Moby Dick | price | high 
Moby Dick | stock | few 
Hamlet  | price | low 
Hamlet  | stock | many 
Faust  | price | medium 
Faust  | stock | normal 

Второй стол: "художники"

 
book  | author 
------------------------------------------ 
Moby Dick | Herman Melville 
Hamlet  | William Shakespeare 
Faust  | Johann Wolfgang von Goethe 

Результирующая таблица, которую я хочу достичь:

 
book  | price | stock | author 
------------------------------------------------------------- 
Moby Dick | high | low | Herman Melville 
Hamlet  | low | high | William Shakespeare 
Faust  | medium | normal | Johann Wolfgang von Goethe 

код я имею в виду, так далеко, чтобы достичь в результате таблица выглядит следующим образом.
Объединяя две таблицы:

 
SELECT T1.book, 
     T1.info, 
     T1.value, 
     T2.book, 
     T2.author 
FROM catalog T1, 
    artists T2 
WHERE T1.book=T2.book 

преобразовательные строк в столбцах:

 
SELECT book, 
MAX(CASE WHEN info = 'price' THEN value END) as price, 
MAX(CASE WHEN info = 'stock' THEN value END) as stock 
FROM catalog 
GROUP BY book 

Но, к сожалению, я не могу объединить эти два.

Благодарим за помощь!

+0

Я не уверен, что у вас есть и то, что вы хотите ..... 'У меня есть this' дать вам' Результирующая Table'? Каково ваше желание? –

+0

Я хочу получить таблицу. Код, где я сейчас стою. Я пытаюсь сделать это более ясным. – LordGhettofaust

+1

Итак, каков ваш текущий запрос и результат? Итак, мы можем видеть, что сейчас не так, и рассказать вам, как идти к вашему желанию. Потому что в вашем другом вопросе вы говорите, что работали. –

ответ

1

Является ли это то, что вы хотите?

SQL Fiddle Demo

SELECT T1.book, 
     MAX(CASE WHEN info = 'price' THEN value END) as price, 
     MAX(CASE WHEN info = 'stock' THEN value END) as stock, 
     MAX(T2.author) as author 
FROM catalog T1 
JOIN artists T2 
    ON T1.book = T2.book 
GROUP BY T1.book; 

ВЫВОД

|  book | price | stock |      author | 
|-----------|--------|--------|----------------------------| 
|  Faust | medium | normal | Johann Wolfgang von Goethe | 
| Hamlet | low | many |  William Shakespeare | 
| Moby Dick | high | few |   Herman Melville | 
+0

Хорошо, это отлично выглядит. Дайте мне мгновение, чтобы воспроизвести его. :-) – LordGhettofaust

+0

Да, это так. Большое спасибо! Узнал многое снова ... – LordGhettofaust

1

Один способ сделать агрегацию, прежде чем делать join, как это:

select a.book, c.price, c.stock, a.author 
from artists a left join 
    (select c.book, 
      max(case when info = 'price' then value end) as price, 
      max(case when info = 'stock' then value end) as stock 
     from catalog c 
     group by c.book 
    ) c 
    on a.book = c.book; 

Или, вы можете join первым, а затем агрегат:

SELECT a.book, 
     MAX(CASE WHEN c.info = 'price' THEN c.value END) as price, 
     MAX(CASE WHEN c.info = 'stock' THEN c.value END) as stock, 
     a.author 
FROM catalog c JOIN 
    artists a 
    ON c.book = a.book 
GROUP BY a.book, a.author; 
Смежные вопросы