我有两个表:
表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';
您也可以使用一些条件聚合获得此结果,然后您不必多次加入 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;
关于mysql - 在 MySQL 中将多行转换为列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26141376/