SQL Select - 合并两个表(同时将行转换为列)
SQL Select - combine two tables (while transforming rows in columns)
的下一步:
在 Informix 数据库上(无数据透视选项),我正在寻找一种使用 SQL 转换以下 table 的动态方法:
第一个table:"catalog"
book | info | value
-----------------------------
Moby Dick | price | high
Moby Dick | stock | few
Hamlet | price | low
Hamlet | stock | many
Faust | price | medium
Faust | stock | normal
第二个table:"artists"
book | author
------------------------------------------
Moby Dick | Herman Melville
Hamlet | William Shakespeare
Faust | Johann Wolfgang von Goethe
结果table,我想实现:
book | price | stock | author
-------------------------------------------------------------
Moby Dick | high | low | Herman Melville
Hamlet | low | high | William Shakespeare
Faust | medium | normal | Johann Wolfgang von Goethe
到目前为止,我想到的实现结果 table 的代码如下所示。
合并两个 tables:
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
但不幸的是,我无法将这两者结合起来。
感谢您的帮助!
一种方法是在执行 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;
这是你想要的吗?
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 |
在 Informix 数据库上(无数据透视选项),我正在寻找一种使用 SQL 转换以下 table 的动态方法:
第一个table:"catalog"
book | info | value ----------------------------- Moby Dick | price | high Moby Dick | stock | few Hamlet | price | low Hamlet | stock | many Faust | price | medium Faust | stock | normal
第二个table:"artists"
book | author ------------------------------------------ Moby Dick | Herman Melville Hamlet | William Shakespeare Faust | Johann Wolfgang von Goethe
结果table,我想实现:
book | price | stock | author ------------------------------------------------------------- Moby Dick | high | low | Herman Melville Hamlet | low | high | William Shakespeare Faust | medium | normal | Johann Wolfgang von Goethe
到目前为止,我想到的实现结果 table 的代码如下所示。
合并两个 tables:
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
但不幸的是,我无法将这两者结合起来。
感谢您的帮助!
一种方法是在执行 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;
这是你想要的吗?
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 |