mysql - 在 MySQL 中将多行转换为列

标签 mysql sql pivot

我有两个表:

表A

+-------+--------+
| Data  | Acc_No |
+-------+--------+
| Unix  |     10 |
| Linux |     20 |
+-------+--------+ 

表B

+-----+----------+--------+
| Obj | Type     | Amount |
+-----+----------+--------+
|  10 | rev      | 100.00 |
|  10 | revision | 200.00 |
+-----+----------+--------+

我想要这样的输出

 +-------+--------+----------+--------+-----------+----------+
 | Data  | Acc_No | Type     | Amount | Type_1    | Amount_1 |
 +-------+--------+----------+--------+-----------+----------+
 | Unix  | 10     | rev      | 100    | revision  | 200      |
 +-------+--------+----------+--------+-----------+----------+

我尝试使用简单的连接来完成它。这是查询:

SELECT a.Data,a.Acc_No, b.Type, b.Amount, bb.Type AS "Type_1", bb.Amount AS "Amount_1"
FROM TableA a,TableB b, TableB bb
WHERE a.Acc_No = b.Obj AND
      b.Obj = bb.Obj AND
      bb.Obj = a.Acc_No AND
      a.Acc_No =10;

但我得到了这个输出。

+------+--------+----------+--------+----------+----------+
| Data | Acc_No | Type     | Amount | Type_1   | Amount_1 |
+------+--------+----------+--------+----------+----------+
| Unix |     10 | rev      | 100.00 | rev      |   100.00 |
| Unix |     10 | revision | 200.00 | rev      |   100.00 |
| Unix |     10 | rev      | 100.00 | revision |   200.00 |
| Unix |     10 | revision | 200.00 | revision |   200.00 |
+------+--------+----------+--------+----------+----------+

我试着在这个网站上搜索答案,甚至用谷歌搜索,但我没有找到正确的答案。

最佳答案

您当前的查询已结束,但我建议对其进行一些小的更改以获得结果。如果您想使用 JOIN 对数据进行“透视”,那么您需要在每个后续联接中区分要从 TableB 返回的值。

例如,当您想要返回 type=rev 时,您需要为该值包含一个特定的过滤器。然后您将对 type=revision 做同样的事情。我还建议使用 LEFT JOIN 加入 TableB,以防每个 都没有 type 值Acc_no 那么你仍然会返回数据。

select
  a.data,
  a.acc_no,
  b.type,
  b.amount,
  bb.type as type_1,
  bb.amount as amount_1
from tablea a
left join tableb b
  on a.acc_no = b.obj
  and b.type = 'rev'
left join tableb bb
  on a.acc_no = bb.obj
  and bb.type = 'revision';

参见 SQL Fiddle with Demo

您也可以使用一些条件聚合获得此结果,然后您不必多次加入 TableB:

select
  a.data,
  a.acc_no,
  max(case when b.type = 'rev' then b.type end) as type,
  max(case when b.type = 'rev' then b.Amount end) as Amount,
  max(case when b.type = 'revision' then b.type end) as type_1,
  max(case when b.type = 'revision' then b.Amount end) as Amount_1
from tablea a
left join tableb b
  on a.acc_no = b.obj
group by a.data, a.acc_no
order by a.acc_no;

参见 SQL Fiddle with Demo

关于mysql - 在 MySQL 中将多行转换为列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26141376/

相关文章:

c# - 如何将多行组合成单个文本?

sql - 帮助创建一个相当复杂的sql语句

php - 如何在一行中显示汇总表和其他表数据?

sql - 如何在sql server中连接一对多记录

sql - 查找具有多个 ActiveRecord HABTM 关联的记录

sql - 在 T-SQL 中透视数据

sql-server - 使用 SQL Pivot 显示所有行,包括记录数为零的行

PHP 使用 Propel 从 MySql 迁移到 Postgres

java - Mysql 和 Hibernate 以及 Lob 列

python - 由pivot_table引入的Pandas NaN