У меня есть следующие данные в базе данных PostgreSQL:
id | sub1 | sub2 | sub3 | sub4 | unique |
---|------|------|------|------|--------|
1 | a | null | null | null | true |
2 | a | null | null | null | true |
3 | a | null | null | null | false |
4 | a | b | null | null | true |
5 | a | b | null | null | false |
6 | null | null | null | null | true |
Мне нужны такие результаты, как группировка и подсчет по подпунктам, например:
sub1 | sub2 | sub3 | sub4 | sum | unique_sum |
a | null | null | null | 3 | 2 |
a | b | null | null | 2 | 1 |
null | null | null | null | 1 | 1 |
Я застрял с этим запросом:
SELECT sub1,
sub2,
sub3,
sub4,
(
SELECT Count(*) AS sum
FROM data
WHERE
CASE
WHEN sub1 notnull THEN sub1 = d.sub1
ELSE sub1 IS NULL
END
AND
CASE
WHEN sub2 notnull THEN sub2 = d.sub2
ELSE sub2 IS NULL
END
AND
CASE
WHEN sub3 notnull THEN sub3 = d.sub3
ELSE sub3 IS NULL
END
AND
CASE
WHEN sub4 notnull THEN sub4 = d.sub4
ELSE sub4 IS NULL
END ) AS sum,
(
SELECT count(*) AS unique_sum
FROM data
WHERE UNIQUE IS true
AND
CASE
WHEN sub1 notnull THEN sub1 = d.sub1
ELSE sub1 IS NULL
END
AND
CASE
WHEN sub2 notnull THEN sub2 = d.sub2
ELSE sub2 IS NULL
END
AND
CASE
WHEN sub3 notnull THEN sub3 = d.sub3
ELSE sub3 IS NULL
END
AND
CASE
WHEN sub4 notnull THEN sub4 = d.sub4
ELSE sub4 IS NULL
END ) AS unique_sum
FROM data AS d
ORDER BY sub1,
sub2,
sub3,
sub4
Я обновляю логику для более реалистичного и подробного примера, добавлены СУММЫ и УНИКАЛЬНЫЕ СУММЫ. Реальные данные сложнее.