Сводные строки SQL с одинаковым идентификатором, конкретным значением во вторичном столбце
Я ищу, чтобы отфильтровать строки в базе данных (PostgreSQL), если одно из значений в status
столбец встречается. Идея заключается в суммировании amount
столбец, если уникальный reference
только имеет status
равно 1
, Запрос не должен SELECT
reference
вообще, если он также имеет статус 2
или любой другой status
в этом отношении. status
относится к состоянию сделки.
Текущая таблица данных:
reference | amount | status
1 100 1
2 120 1
2 -120 2
3 200 1
3 -200 2
4 450 1
Результат:
amount | status
550 1
Я упростил пример данных, но думаю, что он дает хорошее представление о том, что я ищу. Я неудачно выбрал только references
которые имеют только статус 1
, Я пробовал подзапросы, используя HAVING
оговорка и другие методы безуспешны.
Спасибо
4 ответа
Вот способ использования not exists
для суммирования всех строк, где статус равен 1, а других строк с одинаковой ссылкой и статусом, отличным от 1, не существует.
select sum(amount) from mytable t1
where status = 1
and not exists (
select 1 from mytable t2
where t2.reference = t1.reference
and t2.status <> 1
)
SELECT SUM(amount)
FROM table
WHERE reference NOT IN (
SELECT reference
FROM table
WHERE status<>1
)
Подзапрос ВЫБИРАЕТ все reference
Если это необходимо исключить, то основной запрос суммирует все, кроме них
select sum (amount) as amount
from (
select sum(amount) as amount
from t
group by reference
having not bool_or(status <> 1)
) s;
amount
--------
550
Вы могли бы использовать windowed functions
для подсчета случаев, отличных от 1 для каждой группы:
SELECT SUM(amount) AS amount
FROM (SELECT *,COUNT(*) FILTER(WHERE status<>1) OVER(PARTITION BY reference) cnt
FROM tc) AS sub
WHERE cnt = 0;