如何通过连接多个表来扁平化数据

问题描述 投票:0回答:1

我有如下三张表:

T1:
+----+--------+--------+
| id | f1     | f2     |
+----+--------+--------+
| 1  | a      | c      |
| 2  | b      | d      |
+----+--------+--------+

T2:
+----+----+--------+--------+----+
| id | T1 | f1     | f2     | T3 |
+----+----+--------+--------+----+
| 1  | 1  | aa     | 100    | 1  |
| 2  | 1  | bb     | 200    | 1  |
| 3  | 2  | aa     | 56     | 2  |
| 4  | 2  | bb     | 550    | 2  |
| 5  | 2  | cc     | -120   | 3  |
+----+----+--------+--------+----+

T3:
+----+--------+--------+
| id | f4     | f5     |
+----+--------+--------+
| 1  | aaa    | x      |
| 2  | bbb    | y      |
| 3  | ccc    | z      |
+----+--------+--------+

我需要根据 T1 表展平这些表。因此,我需要一个选择查询来通过将 T1 与 T2 和 T3 连接来生成此结果:

+-------+----+----+-----+-----+-------------+------+-----+-----+-----+
| T1_id | f1 | f2 | aa  | bb  | sum(aa, bb) | cc   | aaa | bbb | ccc |
+-------+----+----+-----+-----+-------------+------+-----+-----+-----+
| 1     | a  | c  | 100 | 200 | 300         |      | x   |     |     |
| 2     | b  | d  | 56  | 550 | 610         | -120 |     | y   | z   |
+-------+----+----+-----+-----+-------------+------+-----+-----+-----+

我猜这是一个由

row as column
表解决的
pivot
问题,但我不知道如何在
postgresql
中做到这一点。任何帮助将不胜感激。

sql postgresql pivot pivot-table
1个回答
0
投票

尝试这个查询


SELECT
  T1.id AS T1_id,
  T1.f1,
  T1.f2,
  SUM(CASE WHEN T2.f1 = 'aa' THEN T2.f2 ELSE 0 END) AS aa,
  SUM(CASE WHEN T2.f1 = 'bb' THEN T2.f2 ELSE 0 END) AS bb,
  SUM(CASE WHEN T2.f1 = 'aa' THEN T2.f2 ELSE 0 END) +
  SUM(CASE WHEN T2.f1 = 'bb' THEN T2.f2 ELSE 0 END) AS "sum(aa, bb)",
  MAX(CASE WHEN T2.f1 = 'cc' THEN T2.f2 END) AS cc,
  MAX(CASE WHEN T3.id = 1 THEN f4 END) AS aaa,
  MAX(CASE WHEN T3.id = 2 THEN f4 END) AS bbb,
  MAX(CASE WHEN T3.id = 3 THEN f4 END) AS ccc,
  MAX(CASE WHEN T3.id = 1 THEN f5 END) AS x,
  MAX(CASE WHEN T3.id = 2 THEN f5 END) AS y,
  MAX(CASE WHEN T3.id = 3 THEN f5 END) AS z
FROM T1
LEFT JOIN T2 ON T1.id = T2.T1
LEFT JOIN T3 ON T2.T3 = T3.id
GROUP BY T1.id, T1.f1, T1.f2
ORDER BY T1.id;
© www.soinside.com 2019 - 2024. All rights reserved.