SQL - Как сделать условие исключения

У меня есть следующая таблица. Я пытаюсь получить строки, соответствующие моему конкретному условию.

Таблица выглядит следующим образом:

account|transactiontypecode|
-------|-------------------|
1000058|                  8|
1000067|                  2|
1000067|                  8|

Выходные данные запроса извлекут только учетную запись 1000058, так как она применяется к коду типа транзакции 8. Другая учетная запись также применима, но у нее также есть другой код типа транзакции, который не применяется.

Таким образом, требуется получить учетные записи, соответствующие определенным кодам транзакций, и исключить учетные записи, даже если они также могут иметь требуемый код, но также иметь нежелательные коды.

Это было мое предположение по вышеуказанной проблеме, среди прочего, но я думаю, что другие глаза могут указать мне лучшее направление.

with cte1 as (
select
    gp.account,
    case
        when gp.transactiontypecode in (2,8,17) then TRUE
        else false
    end as txcheck
from
    gp.t2001 gp
group by 
    1, 2)

select
    account,
    txcheck
from
    cte1
where
    txcheck is true and txcheck is not false;

Если кто-нибудь может помочь мне выполнить вышеуказанное требование, было бы здорово!

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
0
157
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вы можете использовать агрегацию в предложении HAVING, проверяя, что количество кодов равно единице, а код равен 8 - оберните его, например. max(), если есть только одно значение, максимум это одно значение:

SELECT gp.account
       FROM gp.t2001 gp
       GROUP BY gp.account
       HAVING count(gp.transactiontypecode) = 1
              AND max(gp.transactiontypecode) = 8;

Или, если разрешено, что код 8 может встречаться несколько раз для учетной записи, и вы хотите, чтобы все они не имели никакого другого кода, измените его, используя условную агрегацию, чтобы подсчитать коды 8 и сравнить его с общим количеством кодов. . Если они совпадают, то все 8:

       ...
       HAVING count(CASE
                      WHEN gp.transactiontypecode = 8 THEN
                        1
                    END) = count(*);

Другой вариант, если код может встречаться более одного раза, — использовать NOT EXISTS для проверки других строк с другим кодом:

SELECT DISTINCT
       gp1.account
       FROM gp.t2001 gp1
       WHERE gp1.transactiontypecode = 8
             AND NOT EXISTS (SELECT *
                                    FROM gp.t2001 gp2
                                    WHERE gp2.account = gp1.account
                                          AND gp2.transactiontypecode <> 8);

Попробуйте что-то вроде этого:

SELECT account
FROM [Table]
GROUP BY account
HAVING 
   COUNT(transactiontypecode) = 1 AND
   transactiontypecode = 8

СЧЕТЧИК внутри предложения наличия должен дать вам учетные записи только с 1 кодом типа транзакции. Затем вы можете применить любое другое условие.

Ответ принят как подходящий

Просто используйте not exists, если вам нужны целые строки:

select t.*
from gp.t2001 t
where t.transactiontypecode  = 8 and
      not exists (select 1
                  from gp.t2001 t2
                  where t2.account = t.account and
                        t2.transactiontypecode <> 8
                 );

Или агрегация, если вам просто нужна учетная запись:

select t.account
from gp.t2001 t
group by t.account
having min(transactiontypecode) = max(transactiontypecode) and
       min(transactiontypecode) = 8;

Большое спасибо всем, я понял, что не существует концепции sql, которую мне не хватало, чтобы исключить определенные записи.

Nicolas Soria 29.05.2019 04:51

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