SQL группа по строкам отрицается полем - PullRequest
0 голосов
/ 11 июня 2018

У меня есть таблица transactions ниже:

| id | type | transaction |
| 1  | A    | 100         |
| 2  | B    | -500        |
| 3  | A    | 300         |
| 4  | A    | 400         |
| 5  | A    | 500         |
| 6  | B    | -300        |
| 7  | B    | -100        |
| 8  | A    | 100         |
| 9  | B    | -100        |
| 10 | A    | 100         |
| 11 | B    | -100        |
| 12 | A    | 100         |

По существу для каждой транзакции типа A сумма transaction будет положительной, а для каждой транзакции типа B - transactionсумма будет отрицательной.(B является транзакцией обращения A).

Какой лучший способ написать оператор выбора sql, чтобы отфильтровать все транзакции, а также их отрицательные транзакции, и оставить только те, которые не были сторнированы.например,

| id | type | transaction |
| 4  | A    | 400         |
| 12 | A    | 100         |

пс.Не будет никаких транзакций типа B без A.

1 Ответ

0 голосов
/ 11 июня 2018

Если есть соответствие 1-1, то not exists работает довольно хорошо:

select t.*
from transactions t
where not exists (select 1
                  from transaction t2
                  where t2.type <> t.type and t2.transaction = - t.transaction
                 );

Это конкретно не работает, когда одна транзакция может иметь несколько одинаковых сумм.Для этого я мог бы порекомендовать агрегирование:

select amount, sum(type = 'A') as num_as, sum(type = 'B') as num_bs
from transactions t
group by abs(amount)
having sum(amount) <> 0;

Это не возвращает исходные строки, но показывает, где что-то не совпадает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...