У меня есть следующая таблица. Я пытаюсь получить строки, соответствующие моему конкретному условию.
Таблица выглядит следующим образом:
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;
Если кто-нибудь может помочь мне выполнить вышеуказанное требование, было бы здорово!
Вы можете использовать агрегацию в предложении 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, которую мне не хватало, чтобы исключить определенные записи.