'how to merge job title with same person in postgresql
I have 2 tables, table anggota and pengurus where the tables are merged, where for example there is the same name with different jabatan then jabatan is combined into one row
tbl anggota :
+----+-------+------+--------+--------+
| id | nama | nik | no_kta | alamat |
+----+-------+------+--------+--------+
| 4 | abas | 0001 | 0021 | a |
| 5 | panji | 0002 | 0022 | b |
| 6 | doni | 0003 | 0023 | c |
+----+-------+------+--------+--------+
tbl pengurus :
+----+-------------+-----------+
| id | id_anggota | jabatan |
+----+-------------+-----------+
| 1 | 4 | ketua |
| 2 | 6 | bendahara |
| 3 | 6 | sekretaris|
+----+-------------+-----------+
postgresql : select a.nama, a.nik, a.no_kta, a.alamat, p.jabatan from anggota a left join pengurus p on a.id = p.id_anggota where a.id_parpol = 4
+-------+------+--------+--------+------------+
| nama | nik | no_kta | alamat | jabatan |
+-------+------+--------+--------+------------+
| abas | 0001 | 0021 | a | ketua |
| doni | 0003 | 0023 | c | bendahara |
| doni | 0003 | 0023 | c | sekretaris |
| panji | 0002 | 0022 | b | null |
+-------+------+--------+--------+------------+
I want the data to come out like this :
+-------+------+--------+--------+-----------------------+
| nama | nik | no_kta | alamat | jabatan |
+-------+------+--------+--------+-----------------------+
| abas | 0001 | 0021 | a | ketua |
| doni | 0003 | 0023 | c | bendahara, sekretaris |
| panji | 0002 | 0022 | b | null |
+-------+------+--------+--------+-----------------------+
Solution 1:[1]
your data
Create temporary table tmp_anggota (
id INTEGER NOT NULL,
nama VARCHAR(50) NOT NULL,
nik VARCHAR(50) NOT NULL,
no_kta VARCHAR(50) NOT NULL,
alamat VARCHAR(10) NOT NULL
);
INSERT INTO tmp_anggota (id, nama, nik, no_kta, alamat)
VALUES
(4, 'abas', '0001', '0021', 'a'),
(5, 'panji', '0002', '0022', 'b'),
(6, 'doni', '0003', '0023', 'c');
create temporary table tmp_pengurus (
id INTEGER NOT NULL,
id_anggota INTEGER NOT NULL,
jabatan VARCHAR(10) NOT NULL
);
INSERT INTO tmp_pengurus(id, id_anggota, jabatan)
VALUES
(1, 4, 'ketua'),
(2, 6, 'bendahara'),
(3, 6, 'sekretaris');
use string_agg as follows
SELECT nama,
nik,
no_kta,
alamat,
String_agg(jabatan, ',') AS jabatan
FROM tmp_anggota a
FULL JOIN tmp_pengurus p
ON a.id = p.id_anggota
GROUP BY nama,
nik,
no_kta,
alamat
ORDER BY nama ASC,
alamat ASC
or by using subquery
SELECT nama,
nik,
no_kta,
alamat,
jabatan
FROM (SELECT id_anggota,
String_agg(jabatan, ',') AS jabatan
FROM tmp_pengurus
GROUP BY id_anggota) P
FULL JOIN tmp_anggota a
ON a.id = p.id_anggota
ORDER BY nama ASC,
alamat ASC
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 |
