Сводные строки 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;

Rextester Demo

Другие вопросы по тегам