postgresql—在sql中将信息从一行扩展到所有相似分组的行

eqqqjvef  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(302)

我不确定完成这项工作所需的逻辑,但我想坐这样一张table。。。

+----+------+
| Id | Type |
+----+------+
| 10 | A    |
| 10 | B    |
| 10 | C    |
| 20 | A    |
| 20 | C    |
+----+------+

…最后得到一张这样的table。。。

+----+------+---+---+---+
| Id | Type | A | B | C |
+----+------+---+---+---+
| 10 | A    | 1 | 1 | 1 |
| 10 | B    | 1 | 1 | 1 |
| 10 | C    | 1 | 1 | 1 |
| 20 | A    | 1 | 0 | 1 |
| 20 | C    | 1 | 0 | 1 |
+----+------+---+---+---+

…每个 Id 将创建新列以合并有关 Type 每一排都是这样 Id . 由于10有一行类型为a、b和c,因此所有id为10的行在新列中都应该有1/true A , B 以及 C .
我知道如何在每一行的基础上这样做,但是我不知道如何将多行中的信息合并到同一id的每一行中。

2cmtqfgy

2cmtqfgy1#

试试下面的逻辑-演示

SELECT *,
(SELECT COUNT(DISTINCT Type) FROM your_table B WHERE B.ID = A.Id and B.Type = 'A') A,
(SELECT COUNT(DISTINCT Type) FROM your_table C WHERE C.ID = A.Id and C.Type = 'B') B,
(SELECT COUNT(DISTINCT Type) FROM your_table D WHERE D.ID = A.Id and D.Type = 'C') C
FROM your_table A

还有一个选择-演示

SELECT *,
SUM(CASE WHEN Type= 'A' THEN 1 ELSE 0 END) OVER(PARTITION BY Id) A,
SUM(CASE WHEN Type= 'B' THEN 1 ELSE 0 END) OVER(PARTITION BY Id) B,
SUM(CASE WHEN Type= 'C' THEN 1 ELSE 0 END) OVER(PARTITION BY Id) C
FROM your_table

相关问题