SQL Select - 组合两个表(在转换行中的行时)

时间:2016-07-07 15:07:39

标签: sql informix

here的下一步:

在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

但不幸的是,我无法将这两者结合起来。

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

这是你想要的吗?

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 |

答案 1 :(得分: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;