Выбор отдельной переменной из одного столбца - PullRequest
0 голосов
/ 15 мая 2018

Вот образец моей таблицы:

Order_id    Item_id Payment_type
2345        120     Cash  
2345        121     Cash    
3346        122     Cash    
3346        123     Check    
3346        124     Check    
4456        125     Check
4456        126     Check    
5456        127     Cash

В одном заказе может быть один или несколько предметов и один или несколько типов оплаты. Но в моем результате я хочу получить идентификатор заказа, в котором в качестве способа оплаты указан только наличные. поэтому в приведенной выше таблице мой результат должен иметь только 2345 и 5456.

Я пытался

Select order_id
from orders
where (payment_type = 'Cash' and payment_type <> 'Check')

, но результат составил 2345, 3346 и 5456.

Я не хочу 3346 в моем результате, так как он имеет наличные и проверить тип оплаты.

Ответы [ 4 ]

0 голосов
/ 16 мая 2018

Тогда общее количество предметов будет равно общему количеству наличных.
Суммируя СЛУЧАЙ, вы можете посчитать последующее.

select order_id
from orders
group by order_id
having count(*) = sum(case payment_type when 'Cash' then 1 else 0 end)

Или суммируя DECODE

select order_id
from orders
group by order_id
having count(*) = sum(decode(payment_type,'Cash',1,0))
0 голосов
/ 16 мая 2018

Опция, в которой используются пункты GROUP BY и HAVING:

SQL> with test as
  2  (select 2345 order_id, 120 item_id, 'Cash' payment_type from dual union all
  3   select 2345, 121, 'Cash'  from dual union all
  4   select 3346, 122, 'Cash'  from dual union all
  5   select 3346, 123, 'Check' from dual union all
  6   select 3346, 124, 'Check' from dual union all
  7   select 4456, 125, 'Check' from dual union all
  8   select 4456, 126, 'Check' from dual union all
  9   select 5456, 127, 'Cash'  from dual
 10  )
 11  select order_id
 12  from test
 13  group by order_id
 14  having min(payment_type) = max(payment_type)
 15    and min(payment_type) = 'Cash';

  ORDER_ID
----------
      5456
      2345

SQL>
0 голосов
/ 16 мая 2018

WHERE применяется к каждой отдельной записи.Таким образом, с WHERE вы не можете узнать, соответствует ли одна запись «Наличным» и ни одна не соответствует «Проверить».Вы должны были бы агрегировать по идентификатору заказа и использовать HAVING для этого:

select order_id
from orders
group by order_id
having count(case when payment_type = 'Cash' then 1 end) > 0
   and count(case when payment_type = 'Check' then 1 end) = 0
order by order_id;
0 голосов
/ 16 мая 2018

Вы можете использовать оператор множеств MINUS (см. документация ).Тестовая таблица:

create table T as
select 2345 Order_id, 120 Item_id, 'Cash' Payment_type from dual union all
select 2345, 121, 'Cash' from dual union all
select 3346, 122, 'Cash'  from dual union all
select 3346, 123, 'Check' from dual union all
select 3346, 124, 'Check' from dual union all
select 4456, 125, 'Check' from dual union all
select 4456, 126, 'Check' from dual union all
select 5456, 127, 'Cash'  from dual;

Запрос

select order_id
from T
minus
select order_id
from T
where payment_type = 'Check'
;

--result
ORDER_ID  
2345      
5456 

Dbfiddle здесь .

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