I have 3 columns as below
| col1 | col2 | price |
|---|---|---|
| abc | 12345 | 10 |
| abc | 12345 | 10 |
| bcd | 45689 | 15 |
| abc | 78945 | 20 |
| bcd | 54782 | 13 |
| def | 12345 | 10 |
| def | 12345 | 10 |
I looking to get result as below.
| col1 | col2 | count | Amount |
|---|---|---|---|
| abc | 12345,78945 | 2 | 30 |
| bcd | 45689,54782 | 2 | 28 |
| def | 12345 | 1 | 10 |
CodePudding user response:
GROUP BY into array_agg with distinct and cardinality to count the length should produce required result:
WITH dataset (col1, col2) AS (
VALUES ('abc', 12345),
('abc', 12345),
('bcd', 45689),
('abc', 78945),
('bcd', 54782),
('def', 12345),
('def', 12345)
)
--query
select col1,
array_agg(distinct col2) col2,
cardinality(array_agg(distinct col2)) count
from dataset
group by col1
order by col1 -- for output ordering
Output:
| col1 | col2 | count |
|---|---|---|
| abc | [12345, 78945] | 2 |
| bcd | [45689, 54782] | 2 |
| def | [12345] | 1 |
If you need different formatting for col2 - use array_join.
