Получение имен клиентов на основе неактивных продуктов - PullRequest
0 голосов
/ 29 января 2019

Я работаю на сервере Oracle:

У меня есть таблица ниже.Я пытаюсь получить клиента, где статус продукта неактивен.Но, если какой-либо продукт того же клиента Статус активен.Я не буду тех список.

+----------------+---------+----------+
|     Client     | Product |  Status  |
+----------------+---------+----------+
| John & Co.     |   12548 | Active   |
| John & Co.     |   58451 | Inactive |
| Vector Inc.    |   12243 | Inactive |
| Vector Inc.    |   84425 | Inactive |
| Ambro Info.    |   11145 | Inactive |
| Infy Tech inc. |   12473 | Active   |
| Infy Tech inc. |   84847 | Active   |
+----------------+---------+----------+

Ожидаемые результаты:

+-------------+
|   Client    |
+-------------+
| Vector Inc. |
| Ambro Info. |
+-------------+

Можем ли мы достичь этого с помощью Oracle Query.

Ответы [ 6 ]

0 голосов
/ 29 января 2019

Я бы просто сделал агрегацию:

SELECT t.client
FROM table t
GROUP BY t.client
HAVING MIN(Status) = MAX(Status) AND MIN(Status) = 'Inactive';
0 голосов
/ 29 января 2019

Вы хотите одну строку результатов для каждого клиента, поэтому вы GROUP BY клиент.Тогда просто проверьте, что есть только статус 'Inactive'.Если единственными возможными статусами являются 'Active' и 'Inactive', вы можете просто запросить минимальное значение:

select client
from mytable
group by client
having min(status) = 'Inactive'
order by client;

При большем количестве статусов вам придется расширить условие, например, and max(status) = 'Inactive' или and min(status) = max(status) или and count(distinct status) = 1 или вместо этого используйте условное агрегирование:

having count(case when status = 'Inactive' then 1 end) > 0
   and count(case when status = 'Active' then 1 end) = 0
0 голосов
/ 29 января 2019

Пожалуйста, попробуйте следующий скрипт,

create table #temp (client varchar(50),product int,status varchar(40))

insert intO #TEMP
VALUES('John & Co.',12548,'Active'),
('John & Co.',58451,'Inactive'),
('Vector Inc',12243,'Inactive'),
('Vector Inc',84425,'Active'),
('Ambro Info.',11145,'Inactive'),
('Infy Tech inc',12473,'Inactive'),
('Infy Tech inc',84847,'Inactive'),
('Infy Tech inc',84847,'Active')

SELECT DISTINCT T.client FROM #temp T
WHERE T.client NOT IN(SELECT Z.client FROM #temp Z WHERE z.status='ACTIVE' and T.client=z.client)
and t.status='Inactive'
drop table #TEMP
0 голосов
/ 29 января 2019

Подумайте обратным образом, вам нужно найти всех клиентов, которых нет в активном списке, поэтому у нас может быть простой запрос: (я использовал #temp таблицу для представления вашей таблицы здесь)

SELECT DISTINCT client
FROM #temp
WHERE status = 'Inactive' -- just incase there are more status rather than 'Active and 'Inactive'
AND client NOT IN
    (SELECT DISTINCT client FROM #temp WHERE status = 'Active')
0 голосов
/ 29 января 2019

enter image description here Вы можете следовать ниже запроса.

create table #temp (cst varchar(50),prodid int,tag varchar(40))

insert intO #TEMP
VALUES('John & Co.',12548,'Active'),
('John & Co.',58451,'Inactive'),
('Vector Inc',12243,'Inactive'),
('Vector Inc',84425,'Inactive'),
('Ambro Info.',11145,'Inactive'),
('Infy Tech inc',12473,'Active'),
('Infy Tech inc',84847,'Active')

SELECT DISTINCT T.CST FROM #temp T
WHERE T.CST NOT IN(SELECT Z.CST FROM #temp Z WHERE TAG='ACTIVE')
0 голосов
/ 29 января 2019

использование не существует

select t1.Client from table_name t1 where 
not exists ( select 1 from table_name t2 where t2.Client=t1.Client and t2.status='Active')

with cte as
(
select 'john' as client,12548 as product, 'Active' as status
union all
select 'john' as client,58451 as product, 'Inactive' as status
union all
select 'Vector Inc', 12243 , 'Inactive'
)select t1.client from cte t1 where 
not exists ( select 1 from cte t2 where t2.client=t1.client and t2.status='Active'
)

демо

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