Oracle SQL CASE pseudo coluna

0

Pergunta

Há 2 tabelas pedidos e config_check.

create table orders (order_created date,
                     cus_no varchar2(20),
                     order_num number,
                     pay_type varchar2(30),
                     MFC date,
                     prod_no varchar2(15) );
                     
create table config_check (check_type varchar2(100),
                     field_name varchar2(10),
                     field_value varchar2(15),
                     start_date date,
                     end_date date
                    );
                    
insert into orders values ('20-NOV-21', 'GT-19Y67', 489, 'Credit Card', NULL, '1000');
insert into orders values ('07-OCT-21', 'NU-20D73', 567, 'Cash on Delivery', '14-OCT-21', '1001');
insert into orders values ('17-NOV-21', 'JP-16V81', 789, 'Cash on Delivery', NULL, '1101');
insert into orders values ('20-NOV-21', 'DZ-17T92', 837, 'Net Banking', '23-NOV-21', '1002');
insert into orders values ('16-SEP-21', 'RJ-18W107', 124, 'Cash on Delivery', NULL, '1002');
insert into orders values ('18-NOV-21', 'KI-19A39', 638, 'Cash on Delivery', NULL, '1000');
insert into orders values ('19-NOV-21', 'FT-20U86', 347, 'Net Banking', NULL, '1002');
insert into orders values ('19-NOV-21', 'FT-20U86', 347, 'Net Banking', NULL, '1110');



insert into config_check VALUES ('Invalid Orders Check', 'PROD_NO', '1000', '16-NOV-21', '30-NOV-21' );
insert into config_check VALUES ('Invalid Orders Check', 'PROD_NO', '1101', '08-SEP-21', '21-SEP-21' );
insert into config_check VALUES ('Invalid Orders Check', 'PROD_NO', '1002', '16-NOV-21', '30-NOV-21' );
insert into config_check VALUES ('Cust Bday Offer', 'CUST_NO', '845796', '13-AUG-21', '23-AUG-21' );

commit;

A tarefa é encontrar cus_no, order_num, onde a ordem é inválido em uma das 3 condições :

  1. pay_type é 'Dinheiro na Entrega' - quando isso acontece, em seguida, um pseudo-coluna denominada comentários devem ter a mensagem 'Este fim de não se qualificar para o Bacalhau'
  2. coluna do MFC não é nulo - quando isso acontece, em seguida, um pseudo-coluna denominada comentários devem ter a mensagem "Esta ordem não pode ser um MFC'
  3. quando um produto adicional é adicionado, que não está listado no config_check tabela. Este precisa de alguma explicação. Então, eu vou tentar o meu melhor com a tabela acima exemplos para explicar em detalhes. Em config_check tabela 2 PROD_NOs (1000 e 1002) para CHECK_TYPE Inválido 'Pedidos de Verificação", que começou em 16-Nov-21. A data de hoje é 21-NOV-2021. Assim, somente aqueles 2 linhas pode ser considerada onde hoje se situa entre a data de início e fim. Agora, o número de ordem 347 tem um número de produto, 1110, o que não é config_check tabela. Em tal caso, a pseudo-coluna denominada comentários deve ter a mensagem "Não listado itens não podem ser ordenados".

Eu tenho o 1 2 condições, mas não têm sido capazes de chegar a 3ª. Aqui está a minha tentativa de consulta :

select o.CUS_NO, o.ORDER_NUM,
       CASE 
            WHEN o.pay_type = 'Cash on Delivery' THEN 'This order does not qualify for Cod'
            WHEN o.MFC IS NOT NULL THEN 'This order can not be an MFC'
       END comments
       from orders o INNER JOIN 
( select * from config_check where check_type = 'Invalid Orders Check' and sysdate between start_date and end_date) c
ON (o.prod_no = c.field_value)
where o.ORDER_CREATED > c.start_date
  AND (o.pay_type = 'Cash on Delivery' OR o.MFC IS NOT NULL);

A consulta acima dá o resultado como :

  1. DZ-17T92 837 Esta ordem não pode ser um MFC
  2. KI-19A39 638 Esta ordem não qualifica para o Bacalhau

enter image description here

O Caso deveria ter outro QUANDO a cláusula para a 3ª condição e o mesmo deve ser entre parênteses E cláusula no último. Eu não posso começar a 3ª condição, no CASO do bloco. Alguém por favor pode me ajudar a obter o resultado desejado? A saída desejada deve ser

  1. DZ-17T92 837 Esta ordem não pode ser um MFC
  2. KI-19A39 638 Esta ordem não qualifica para o Bacalhau
  3. FT-20U86 347 Não itens listados não podem ser ordenadas

enter image description here

Olhando para o ajudar ou até mesmo ponteiros vai ser ótimo. Obrigado por ler esse longo post.

Edit : estou a ter problemas colando a saída da consulta em formato de tabela. Vou compartilhar a saída no formato jpeg.

case oracle sql
2021-11-20 20:21:40
1
0

Você usa outra condição, em CASO de declaração.

select o.CUS_NO, o.ORDER_NUM,
       CASE 
            WHEN o.pay_type = 'Cash on Delivery' THEN 'This order does not qualify for Cod'
            WHEN o.MFC IS NOT NULL THEN 'This order can not be an MFC'
        enter code here    **ELSE 'Non listed item can not be ordered'**                
       END as  comments
       from orders o INNER JOIN 
( select * from config_check where check_type = 'Invalid Orders Check' and sysdate between start_date and end_date) c
ON (o.prod_no = c.field_value)
where o.ORDER_CREATED > c.start_date
  AND (o.pay_type = 'Cash on Delivery' OR o.MFC IS NOT NULL);
2021-11-22 04:49:36

Eu não era capaz de obter o que <digite o código de seu> parte.
Arty155

Eu tenho consulta: select o1.cus_no, o1.order_num, 'Não listados itens não podem ser ordenados", com ordens o1 onde exists ( select 1 from (select o.* a partir de encomendas o INNER JOIN ( select * from config_check onde check_type = 'Inválido Pedidos de Verificação" e sysdate entre data_inicial e data_final) c EM (o'.prod_no = c.field_value) onde s.ORDER_CREATED > c.data_inicial) i onde eu.ORDER_NUM = o1.ORDER_NUM E o1.prod_no NÃO (seleccione FIELD_VALUE de config_check onde check_type = 'Inválido Pedidos de Verificação" e sysdate entre data_inicial e data_final) ) ; o que me leva a ordem num 347
Arty155

Em outros idiomas

Esta página está em outros idiomas

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................