Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

igor.js167

[Resolvido] Retornar resultados de case em um novo atributo

Recommended Posts

Boa tarde,

 

No banco de dados tenho as informações a seguir, em diferentes tabelas: Acesso,  Dose prescrita, tempo e volume. Preciso, de acordo com essas informações, calcular dois valores chamados bolus e rate seguindo uma condicional. O problema é como vou retornar estes dois valores, se não tem atributo onde eu possa inseri-los?

 

Eu deveria criar uma nova tabela pra eles? Existe como retornar estes atributos sem ter de mexer em nenhuma tabela?

O código atual que tenho, é:

select 
  a.nr_atendimento ATENDIMENTO,
  obter_nome_pf_atend(a.nr_atendimento) NOME,
  obter_data_nascto_pac_atend(a.nr_atendimento) NASCIMENTO,
  'DOSE: ' || decode(a.qt_dose,',5','2.500 UI','1','5.000 UI','1,5','7.500 UI','2','10.000 UI','2,5','12.500 UI','3','15.000 UI','3,5','17.500 UI',
                      '4','20.000 UI','4,5','22.500 UI','5','25.000 UI','5,5','27.500 UI','6','30.000 UI') DOSE,
  'VOLUME: ' || a.qt_volume || ' ml' VOLUME,
  obter_desc_material(a.cd_material) MEDICAMENTO,
  d.qt_hora_min_sessao TEMPO,
  e.nr_seq_tecnica ACESSO
  -- Inserir aqui condicionais para cálculo de BOLUS e RATE 
from 
  CPOE_material a, atend_paciente_unidade b, hd_escala_dialise c, cpoe_dialise d, hd_acesso e
where
  a.cd_material = 49749 and
  a.nr_atendimento = b.nr_atendimento and
  d.nr_atendimento = b.nr_atendimento and
  obter_cd_pes_fis_atend(b.nr_atendimento) = c.cd_pessoa_fisica and
  b.dt_saida_unidade is null and
  a.dt_liberacao is not null and
  a.dt_suspensao is null and
  d.dt_liberacao is not null and
  d.dt_suspensao is null and
  c.dt_fim is null and
  e.cd_pessoa_fisica = obter_pessoa_atendimento(b.nr_atendimento,'C') and
  e.ie_adequado = 'S' and
  e.dt_perda_retirada is null and
  c.nr_seq_turno = :turno and
  c.nr_seq_escala = :escala

E as condicionais que quero inserir é mais ou menos assim:

SE acesso arteriovenoso então:
	se dose_prescrita = 2500 então bolus = volume e rate = '-'
	
	se dose_prescrita = 5000 então:
		se tempo = 2:00h, 2:05h, 2:30h ou 2:35h então Bolus = volume e rate = '-'
		se tempo = 3:00h ou 3:05 então Bolus = 6,0 e rate = 1,6
		se tempo = 3:30h ou 3:35 então Bolus = 6,0 e rate = 1,3
		se tempo = 4:00 ou 4:05h então bolus = 6,0 e rate = 1,1
	
	se dose_prescrita = 7500 então
		se tempo = 2:00h, 2:05h, 2:30h ou 2:35h então Bolus = volume e rate = '-'
		se tempo = 3:00h ou 3:05 então Bolus = 8,0 e rate = 2,8
		se tempo = 3:30h ou 3:35 então Bolus = 8,0 e rate = 2,3
		se tempo = 4:00 ou 4:05h então bolus = 8,0 e rate = 2,0

	se dose_prescrita = 10000 então
		se tempo = 2:00h, 2:05h, 2:30h ou 2:35h então Bolus = volume e rate = '-'
		se tempo = 3:00h ou 3:05 então Bolus = 10,0 e rate = 4,0
		se tempo = 3:30h ou 3:35 então Bolus = 10,0 e rate = 3,3
		se tempo = 4:00 ou 4:05h então bolus = 10,0 e rate = 2,9

	se dose_prescrita = 12500 então
		se tempo = 2:00h, 2:05h, 2:30h ou 2:35h então Bolus = volume e rate = '-'
		se tempo = 3:00h ou 3:05 então Bolus = 11,0 e rate = 5,6
		se tempo = 3:30h ou 3:35 então Bolus = 11,0 e rate = 4,7
		se tempo = 4:00 ou 4:05h então bolus = 11,0 e rate = 4,0
	
	se dose_prescrita = 15000 então
		se tempo = 2:00h, 2:05h, 2:30h ou 2:35h então Bolus = volume e rate = '-'
		se tempo = 3:00h ou 3:05 então Bolus = 13,0 e rate = 6,8
		se tempo = 3:30h ou 3:35 então Bolus = 13,0 e rate = 5,7
		se tempo = 4:00 ou 4:05h então bolus = 13,0 e rate = 4,9
	
	
	se dose_prescrita = 30000 então
		se tempo = 2:00h, 2:05h, 2:30h ou 2:35h então Bolus = volume e rate = '-'
		se tempo = 3:00h ou 3:05 então Bolus = 23,0 e rate = 14,8
		se tempo = 3:30h ou 3:35 então Bolus = 23,0 e rate = 12,3
		se tempo = 4:00 ou 4:05h então bolus = 23,0 e rate = 10,6

	se não 
		então null


SE acesso cateter então:
	se dose_prescrita = 2500 então bolus = volume e rate = '-'
	
	se dose_prescrita = 5000 então:
		se tempo = 2:00h, 2:05h, 2:30h ou 2:35h então Bolus = volume e rate = '-'
		se tempo = 3:00h ou 3:05 então Bolus = 6,0 e rate = 1,3
		se tempo = 3:30h ou 3:35 então Bolus = 6,0 e rate = 1,1
		se tempo = 4:00 ou 4:05h então bolus = 6,0 e rate = 1,0
	
	se dose_prescrita = 7500 então
		se tempo = 2:00h, 2:05h, 2:30h ou 2:35h então Bolus = volume e rate = '-'
		se tempo = 3:00h ou 3:05 então Bolus = 8,0 e rate = 2,3
		se tempo = 3:30h ou 3:35 então Bolus = 8,0 e rate = 2,0
		se tempo = 4:00 ou 4:05h então bolus = 8,0 e rate = 1,8

	se dose_prescrita = 10000 então
		se tempo = 2:00h, 2:05h, 2:30h ou 2:35h então Bolus = volume e rate = '-'
		se tempo = 3:00h ou 3:05 então Bolus = 10,0 e rate = 3,3
		se tempo = 3:30h ou 3:35 então Bolus = 10,0 e rate = 2,9
		se tempo = 4:00 ou 4:05h então bolus = 10,0 e rate = 2,5

	se dose_prescrita = 12500 então
		se tempo = 2:00h, 2:05h, 2:30h ou 2:35h então Bolus = volume e rate = '-'
		se tempo = 3:00h ou 3:05 então Bolus = 11,0 e rate = 4,7
		se tempo = 3:30h ou 3:35 então Bolus = 11,0 e rate = 4,0
		se tempo = 4:00 ou 4:05h então bolus = 11,0 e rate = 3,5
	
	se dose_prescrita = 15000 então
		se tempo = 2:00h, 2:05h, 2:30h ou 2:35h então Bolus = volume e rate = '-'
		se tempo = 3:00h ou 3:05 então Bolus = 13,0 e rate = 5,7
		se tempo = 3:30h ou 3:35 então Bolus = 13,0 e rate = 4,9
		se tempo = 4:00 ou 4:05h então bolus = 13,0 e rate = 4,3
	
	
	se dose_prescrita = 30000 então
		se tempo = 2:00h, 2:05h, 2:30h ou 2:35h então Bolus = volume e rate = '-'
		se tempo = 3:00h ou 3:05 então Bolus = 23,0 e rate = 12,3
		se tempo = 3:30h ou 3:35 então Bolus = 23,0 e rate = 10,6
		se tempo = 4:00 ou 4:05h então bolus = 23,0 e rate = 9,3

Atenciosamente,

Igor
 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Em principio eu faria uma FUNCTION ,

Estes valores da dose_prescrita são assim mesmos discretos (2500 , 5000 etc) ?

Compartilhar este post


Link para o post
Compartilhar em outros sites
Agora, Motta disse:

Em principio eu faria uma FUNCTION ,

Estes valores da dose_prescrita são assim mesmos discretos (2500 , 5000 etc) ?

Isso, são padronizados... 2500, 5000, 7500, 10.000 e 12.5000.

 

Vou ter que pesquisar como funciona a criação de função, nunca fiz uma antes

Compartilhar este post


Link para o post
Compartilhar em outros sites

Estou tentando criar minha primeira function, já fucei em muito fórum e vídeo aula de ontem pra hoje, mas por algum motivo parece que está sempre faltando alguma coisa pra compilar certinho.
No caso, agora, ele está dando erro no fim do código. ele diz que espera um 'case' depois do end. Mas eu só quero terminar o código e acredito que já dei fim em todos os cases e ifs.

 

Abaixo o código (um pouco extenso, mas é repetitivo):
 

create or replace function calcular_bolus_rate(nr_seq_tecnica number, 
                                               qt_dose number, 
                                               qt_hora_min_sessao varchar2,
                                               qt_volume number, valor_opcao varchar2)
  return varchar2 is

valor_bolus varchar2(5); -- Se valor_opcao = 'b' ou 'B'
valor_rate varchar2(5); -- Se valor opcao = 'r' ou 'R'
valor varchar2(5);

BEGIN
case when nr_seq_tecnica in (4,5,6,8) then
  -- se dose prescrita = 2.500UI
  if qt_dose = ',5' then 
    valor_bolus := to_char(qt_volume, '999');
    valor_rate := '-';
  end if;
  
  -- se dose prescrita = 5.000UI
  if qt_dose = '1' then
    case 
      when qt_hora_min_sessao in ('02:00','02:05','02:30','02:35') then
        valor_bolus := to_char(qt_volume, '999');
        valor_rate := '-';
  
      when qt_hora_min_sessao in ('03:00','03:05') then
        valor_bolus := '6,0';
        valor_rate := '1,6';
    
      when qt_hora_min_sessao in ('03:30','03:35') then
        valor_bolus := '6,0';
        valor_rate := '1,3';
      
      when qt_hora_min_sessao in ('04:00','04:05') then
        valor_bolus := '6,0';
        valor_rate := '1,1';
      else 
        return null;
      end case;
    end if;
  -- se dose prescrita = 7.500UI
  if qt_dose = '1,5' then
    case
      when qt_hora_min_sessao in ('02:00','02:05','02:30','02:35') then
      valor_bolus := to_char(qt_volume, '999');
      valor_rate := '-';
  
      when qt_hora_min_sessao in ('03:00','03:05') then
      valor_bolus := '8,0';
      valor_rate := '2,8';
    
      when qt_hora_min_sessao in ('03:30','03:35') then
      valor_bolus := '8,0';
      valor_rate := '2,3';
      
      when qt_hora_min_sessao in ('04:00','04:05') then
      valor_bolus := '8,0';
      valor_rate := '2,0';
   
    else 
      return null;
    end case;
  end if;
  -- se dose prescrita = 10.00UI
  if qt_dose = '2' then
    case
      when qt_hora_min_sessao in ('02:00','02:05','02:30','02:35') then
        valor_bolus := to_char(qt_volume, '999');
        valor_rate := '-';
  
      when qt_hora_min_sessao in ('03:00','03:05') then
        valor_bolus := '10,0';
        valor_rate := '4,0';
    
      when qt_hora_min_sessao in ('03:30','03:35') then
        valor_bolus := '10,0';
        valor_rate := '3,3';
      
      when qt_hora_min_sessao in ('04:00','04:05') then
        valor_bolus := '10,0';
        valor_rate := '2,9';
   
      else
        return null;
      end case;
    end if;
-- se dose prescrita = 12.500UI
  if qt_dose = '2,5' then
    case
      when qt_hora_min_sessao in ('02:00','02:05','02:30','02:35') then
        valor_bolus := to_char(qt_volume, '999');
        valor_rate := '-';
  
      when qt_hora_min_sessao in ('03:00','03:05') then
        valor_bolus := '11,0';
        valor_rate := '5,6';
    
      when qt_hora_min_sessao in ('03:30','03:35') then
        valor_bolus := '11,0';
        valor_rate := '4,7';
      
      when qt_hora_min_sessao in ('04:00','04:05') then
        valor_bolus := '11,0';
        valor_rate := '4,0';
   
    else
      return null;
    end case;
  end if;

-- se dose prescrita = 15.000UI
  if qt_dose = 3 then
    case
      when qt_hora_min_sessao in ('02:00','02:05','02:30','02:35') then
        valor_bolus := to_char(qt_volume, '999');
        valor_rate := '-';
  
      when qt_hora_min_sessao in ('03:00','03:05') then
        valor_bolus := '13,0';
        valor_rate := '6,8';
    
      when qt_hora_min_sessao in ('03:30','03:35') then
        valor_bolus := '13,0';
        valor_rate := '5,7';
      
      when qt_hora_min_sessao in ('04:00','04:05') then
        valor_bolus := '13,0';
        valor_rate := '4,9';
    
    else
      return null;
    end case;
  end if;

-- se dose prescrita = 30.000UI
  if qt_dose = '6' then
    case
      when qt_hora_min_sessao in ('02:00','02:05','02:30','02:35') then
        valor_bolus := to_char(qt_volume, '999');
        valor_rate := '-';
  
      when qt_hora_min_sessao in ('03:00','03:05') then
        valor_bolus := '23,0';
        valor_rate := '14,8';
    
      when qt_hora_min_sessao in ('03:30','03:35') then
        valor_bolus := '23,0';
        valor_rate := '12,3';
      
      when qt_hora_min_sessao in ('04:00','04:05') then
        valor_bolus := '23,0';
        valor_rate := '10,6';
    
    else
      return null;
    end case;
  end if;
-- Se opção = 'B' ou 'b'
case 
  when valor_opcao = 'b' or valor_opcao = 'B' then
      valor := valor_bolus;
    return valor;
  when valor_opcao = 'r' or valor_opcao = 'R' then
      valor := valor_rate;
    return valor;
  else
    return null;
end case;

return valor;

end;

 

Compartilhar este post


Link para o post
Compartilhar em outros sites
1 hora atrás, Motta disse:

Eu trocaria estes "cases" por

 

If xxxx then

Elsif then

Else

End if;

 

https://www.techonthenet.com/oracle/loops/if_then.php

 

 

Obrigado Motta!
Na verdade, eu descobri que o problema foi que eu não tinha fechado o primeiro case e resolvi.
Tentei colocar tudo com if, mas alguns estavam dando alguns problemas no elsif, mas vou tentar novamente depois...

Muito obrigado pelo suporte! Eu estava receoso de tentar algo novo, como functions, mas agora evolui um pouco nos meus conhecimentos de DB e vou praticar mais!

Valeu! :grin:

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por dfoliveira82
      Bom dia senhores,
       
      sou novo no Oracle, antes trabalhava com SQL SERVER, e me deparei com algo que ja estou a horas tentando solucionar mas nao consegui.
      Nessa Trigger que vou postar, quando mando compilar ela, fala que esta faltando uma virgula, apos o values, mas nao precisa dela e nao acho onde pode ser essa virgula faltante.
      CREATE OR REPLACE TRIGGER JOBS_CL_INSERE_USUARIO AFTER INSERT OR UPDATE OF EXPORTADA_AVA ON SITE_USUARIOS REFERENCING NEW AS NEW BEGIN INSERT INTO BLACKBEAN.TBL_USERS VALUES (NULL, 'INSERT', NULL, 'db', '0', '0', '0', TO_CHAR(:NEW.CPF), MD5(:NEW.CPF||'port@l'), TO_CHAR(:NEW.CPF), SUBSTRING(:NEW.NOME, 1, INSTR(:NEW.NOME, ' ')-1), SUBSTRING(:NEW.NOME, INSTR(:NEW.NOME, ' ')+1, LEN(:NEW.NOME)), 'email@email.com', NULL, NULL, DATE_TO_UNIX_TS(SYSDATE), NULL, NULL); END; / Se alguem puder me ajudar agradeceria.
    • Por asacap1000
      Olá galera estou quebrando a cabeça aqui e não sei mais o que fazer. Estamos migrando nossa intranet que estava desatualizada demais e estamos colocando toda ela em php7.3.
      Dentro desse sistema temos varias consultas que são realizadas no Oracle. As consultas estão ocorrendo 100% mas ao chegar na plataforma de relatórios travou tudo. Não consegui acertar o meio de consultar por período, já utilizei "to_date, to_char, trunc" e nada. Interessante que no PLSQL o to_date funciona certo
      SELECT DISTINCT TO_DATE(IO.TIME_ARRIVAL)
        FROM IN_OUT IO
       WHERE TO_DATE(IO.TIME_ARRIVAL) BETWEEN '01/11/2021' AND '23/11/2021'
       
      1    04/11/2021
      2    18/11/2021
      3    17/11/2021
      4    14/11/2021
      5    22/11/2021
      6    08/11/2021
      7    11/11/2021
      8    13/11/2021
      9    09/11/2021
      10    10/11/2021
      11    05/11/2021
      12    19/11/2021
      13    15/11/2021
      14    03/11/2021
      15    06/11/2021
      16    23/11/2021
      17    01/11/2021
      18    02/11/2021
      19    16/11/2021
      20    20/11/2021
      21    12/11/2021
      22    21/11/2021
       
      Se eu utilizar ele ignora a data que estabeleci para a consulta
       TO_CHAR(IO.TIME_ARRIVAL,'DD/MM/YYYY') BETWEEN '01/11/2021' AND '23/11/2021'
       
      1    03/07/2013
      2    05/07/2013
      3    18/06/2013
      4    21/05/2013
      5    20/05/2013
      6    12/08/2013
      7    21/08/2013
      8    23/08/2013
      9    02/09/2013
      10    12/09/2013
       
      Isso no PLSQL, no caso do PHP o to_date não funciona nem gera o relatório, e no to_char funciona mas ignorando as datas apontadas.
       
      O que dá pra  fazer pra resolver isso, tenho que finalizar essa migração até final de Dezembro e estou começando a ficar preocupado com o tempo
       
      Agradeço qualquer ajuda que vier
    • Por ldblucas
      Boa tarde,
       
      Atualmente qual a melhor formar de fazer um conexao C# com o banco Oracle ?
       
       
       
      desde já agradeço
    • Por mr22robot
      select A.CODPROD,A.DESCRICAO,A.DTMOVLOG DATA,A.NUMNOTA,ROUND(A.QT,2)QTDE,A.PUNIT,A.NOMECODOPER OPERACAO,ROUND(A.P_TOTAL,2)P_TOTAL, (SELECT QTEST - PCEST.QTRESERV QTEST FROM PCEST WHERE CODFILIAL = 1 AND CODPROD = A.CODPROD)QTESTOQUE FROM( SELECT PCMOV.CODPROD,PCMOV.DESCRICAO, TRUNC(PCMOV.DTMOV) DTMOV, PCMOV.DTMOVLOG, PCMOV.NUMNOTA, PCMOV.NUMSEQ, PCMOV.NUMSEQPED, PCMOV.NUMTRANSENT, PCMOV.DTCANCEL, DECODE(DTCANCEL,NULL,'','Cancelado') SITUACAO, PCMOV.CODUSUR, PCMOV.NUMTRANSVENDA, PCMOV.NUMCAR, PCMOV.NUMLOTE, PCMOV.CODFISCAL, NVL(PCMOV.CUSTOREAL,0) CUSTOREAL, NVL(PCMOV.CUSTOFIN,0) CUSTOFIN, (CASE WHEN (SUBSTR(PCMOV.CODOPER,1,1) = 'E') THEN NVL(PCMOV.CUSTOFIN,0) ELSE NVL(PCMOV.CUSTOFINEST,0) END) CUSTOFINEST, NVL(PCMOV.CUSTOULTENT,0) CUSTOULTENT, NVL(PCMOV.CUSTOFORNEC,0) CUSTOFORNEC, NVL(PCMOV.CUSTOCONT,0) CUSTOCONT, DECODE(PCMOV.CODOPER, 'E',PCMOV.CODFORNEC, 'EB',PCMOV.CODFORNEC, 'ET',PCMOV.CODFORNEC, 'ER',PCMOV.CODFORNEC, 'ES',PCMOV.CODFORNEC, PCMOV.CODCLI) CODCLI, NVL(PCMOV.CODFUNCLANC,0) AS CODFUNCLANC, DECODE(SUBSTR(PCMOV.CODOPER, 1, 1), 'S',(PCMOV.QT * (-1)), 'R',(PCMOV.QT * (-1)), DECODE(NVL(PCMOVCOMPLE.QTRETORNOTV13, 0), 0, NVL(PCMOV.QT, 0), PCMOVCOMPLE.QTRETORNOTV13)) AS QT, NVL(PCMOV.PUNIT,0) PUNIT, PCMOV.CODOPER, DECODE(PCMOV.CODOPER, 'E', DECODE(GREATEST(PCMOV.QT,0),0,'Entrada Cancelada','Entrada Merc.'), 'EB',DECODE(GREATEST(PCMOV.QT,0),0,'Bonif. Cancelada','Entrada Bonific.'), 'ET',DECODE(GREATEST(PCMOV.QT,0),0,'Entrada Transf. Cancelada','Entrada Transf.'), 'EA',DECODE(GREATEST(PCMOV.QT,0),0,'Entrada Ajuste Cancelada','Ajuste Estoque'), 'E1',DECODE(GREATEST(PCMOV.QT,0),0,'Entrada Avaria Cancelada','Entrada Avaria'), 'EI',DECODE(GREATEST(PCMOV.QT,0),0,'Ajuste Invent. Cancelado','Ajuste Invent.'), 'ED',DECODE(GREATEST(PCMOV.QT,0),0,'Devolução Cancelada','Dev. Cliente'), 'EN',DECODE(GREATEST(PCMOV.QT,0),0,'Dev. Venda Consig. Cancelada','Dev. Venda Consignada'), 'ER',DECODE(GREATEST(PCMOV.QT,0),0,'Simples Remessa Cancelada','Simples Remessa'), 'ES',DECODE(GREATEST(PCMOV.QT,0),0,'Sobra Mercadoria Cancelamento','Sobra de Mercadoria'), 'EM',DECODE(GREATEST(PCMOV.QT,0),0,'Ent. Mat. Consumo Cancelada','Entrada Materiais de Consumo'), 'EC',DECODE(GREATEST(PCMOV.QT,0),0,'Ent. Consig. Cancelada','Entrada Consignação'), 'EO',DECODE(GREATEST(PCMOV.QT,0),0,'Dev. Comodato Cancelada','Devolução de Comodato'), 'EX',DECODE(GREATEST(PCMOV.QT,0),0,'Dev. Avulsa Cancelada','Devolução Avulsa'), 'EG',DECODE(GREATEST(PCMOV.QT,0),0,'Entrada Benefic. Cancelada','Entrada de Beneficiamento'), 'S', DECODE(GREATEST(PCMOV.QT,0),0,'NF Cancelada','Saida'), 'SD',DECODE(GREATEST(PCMOV.QT,0),0,'Dev. Cancelada','Dev. Fornecedor'), 'SB',DECODE(GREATEST(PCMOV.QT,0),0,'Saida Bonific. Cancelada','Saida Bonific.'), 'ST',DECODE(GREATEST(PCMOV.QT,0),0,'Saida Transf. Cancelada','Saida Transf.'), 'S1',DECODE(GREATEST(PCMOV.QT,0),0,'Avaria Reaprov. Cancelada','Avaria por Reaproveitamento'), 'SS',DECODE(GREATEST(PCMOV.QT,0),0,'Saída Sobra Cancelada','Saída de Sobra'), 'SA',DECODE(GREATEST(PCMOV.QT,0),0,'Saída Ajuste Cancelada','Ajuste Estoque'), 'SI',DECODE(GREATEST(PCMOV.QT,0),0,'Ajuste Invent. Cancelado','Ajuste Invent.'), 'SR',DECODE(GREATEST(PCMOV.QT,0),0,'Simples Remessa Cancelada','Simples Remessa'), 'SC',DECODE(GREATEST(PCMOV.QT,0),0,'Saída Consig. Cancelada','Saída Consignação'), 'SO',DECODE(GREATEST(PCMOV.QT,0),0,'Remessa Comodato Cancelada','Remessa de Comodato'), 'SF',DECODE(GREATEST(PCMOV.QT,0),0,'Dev. Comodato Fornec. Cancelada','Devolução de Comodato a Fornecedor'), 'RA',DECODE(GREATEST(PCMOV.QT,0),0,'Req. Avulsa Cancelada','Requisição Avulsa'), 'EP',DECODE(GREATEST(PCMOV.QT,0),0,'Cancelamento Produção','Entrada Produção'), 'SP',DECODE(GREATEST(PCMOV.QT,0),0,'Cancelamento Produção','Requisição Mat.Prima'), 'SV',DECODE(GREATEST(PCMOV.QT,0),0,'Saída Avaria Cancelada','Saída por Avaria'), 'SM',DECODE(GREATEST(PCMOV.QT,0),0,'Saída Mat. Consumo Cancelada','Saída Materiais de Consumo'), 'SL',DECODE(GREATEST(PCMOV.QT,0),0,'Saída Perda Cancelada','Saída de Perda'), 'EL',DECODE(GREATEST(PCMOV.QT,0),0,'Ent. Perda Cancelada','Entrada de Perda'), 'EF',DECODE(GREATEST(PCMOV.QT,0),0,'Entrada Comodato Cancelada','Entrada de Comodato'), 'SN',DECODE(GREATEST(PCMOV.QT,0),0,'Saída Benefic. Cancelada','Saída de Beneficiamento'), 'EV',DECODE(GREATEST(PCMOV.QT,0),0,'Ent. Dev. Rem. Benefic. Cancelada','Entrada Devolução de Remessa para Beneficiamento'), 'EG',DECODE(GREATEST(PCMOV.QT,0),0,'Ent. Benefic. Cancelada','Entrada de Beneficiamento'), 'Desconhecido') NOMECODOPER, (NVL(PCMOV.PUNIT,0)*DECODE(NVL(PCMOVCOMPLE.QTRETORNOTV13, 0), 0, NVL(PCMOV.QT, 0), PCMOVCOMPLE.QTRETORNOTV13)) P_TOTAL, (CASE WHEN PCMOV.CODOPER IN ('SA', 'EA') THEN (SELECT DISTINCT HISTORICO FROM PCLANC WHERE NUMTRANSENT = PCMOV.NUMTRANSENT AND ROWNUM = 1) ELSE ' ' END) MOTIVO FROM PCMOV, PCPRODUT, PCMOVCOMPLE WHERE PCMOV.CODPROD IN(SELECT CODPROD FROM PCPRODUT WHERE CODSEC IN(10020)) AND PCMOV.CODPROD = PCPRODUT.CODPROD AND PCMOV.NUMTRANSITEM = PCMOVCOMPLE.NUMTRANSITEM(+) AND NVL(PCMOVCOMPLE.MOVEST, 'S') = 'S' AND PCMOV.DTMOV BETWEEN '01-JAN-2020' AND '29-SEP-2021' AND NVL(PCMOV.CODFILIALNF, PCMOV.CODFILIAL) = '1' AND PCMOV.CODOPER <> 'S' AND ((NVL(PCPRODUT.ESTOQUEPORLOTE, 'N') = 'S' AND PCMOV.NUMLOTE IS NOT NULL) OR (NVL(PCPRODUT.ESTOQUEPORLOTE, 'N') = 'N' AND PCMOV.NUMLOTE IS NULL)) AND PCMOV.STATUS IN ('B','AB') AND NOT EXISTS (SELECT DISTINCT (PCNFSAID.NUMTRANSVENDA) FROM PCNFSAID, PCPRODUT WHERE PCNFSAID.NUMTRANSVENDA = PCMOV.NUMTRANSVENDA AND PCNFSAID.CODFILIAL = PCMOV.CODFILIAL AND PCMOV.CODOPER = 'S' AND PCNFSAID.CONDVENDA IN (4, 7, 14) AND PCMOV.CODPROD = PCPRODUT.CODPROD AND PCPRODUT.TIPOMERC = 'CB') AND NOT (FERRAMENTAS.F_BUSCARPARAMETRO_ALFA('DEVOLVESIMPLESREMTV13TOTAL',PCMOV.CODFILIAL,'N') = 'S' AND PCMOV.ROTINACAD LIKE '%1332%' AND NVL(PCMOVCOMPLE.QTRETORNOTV13,0) = 0) AND NOT EXISTS (SELECT NUMNOTA FROM PCNFSAID WHERE NUMTRANSVENDA = PCMOV.NUMTRANSVENDA AND SITUACAONFE IN (110,205,301,302,303)) ORDER BY PCMOV.CODOPER, PCMOV.DTMOV, PCMOV.NUMNOTA )A WHERE A.DTCANCEL IS NULL AND A.CODOPER = 'E' ORDER BY CODPROd,DATA Boa tarde. Estou com essa dúvida:
      Preciso em um select trazer os dados com a seguinte condição: 
      Quando  o valor do punit repetir, somente traz o ultimo registro. ou seja a maior data. 
      caso contrário, traz todos os registros. 
      é possíveç, mais não sei como. Tentei usar o ROW_NUMBER(). Mas não encontrei uma forma de usar. 
      Greato
    • Por Priscila1307
      CREATE TABLE CLIENTE( Idcliente int, nome varchar(60), dtnascimento date, cpf varchar(11), CONSTRAINT pk_cliente PRIMARY KEY (Idcliente) ); CREATE TABLE PEDIDO( Idpedido int, Idcliente int, datapedido date, vltotal decimal(10,2), CONSTRAINT pk_pedido PRIMARY KEY (Idpedido), CONSTRAINT fk_pedido_cliente FOREIGN KEY (Idcliente) REFERENCES CLIENTE(Idcliente) ); CREATE TABLE PRODUTO( Idproduto int, descricao varchar(100), quantidade int, CONSTRAINT pk_produto PRIMARY KEY (Idproduto) ); CREATE TABLE ITEMPEDIDO( Idpedido int, Nritem int, valor decimal(10,2), quantidade int, Idproduto int, CONSTRAINT pk_itempedido PRIMARY KEY (Idpedido, Nritem), CONSTRAINT fk_Idpedido FOREIGN KEY (Idpedido) REFERENCES PEDIDO (Idpedido), CONSTRAINT fk_itempedido_produto FOREIGN KEY (Idproduto) REFERENCES PRODUTO (Idproduto) ); CREATE TABLE LOG( Idlog int, data date, descricao varchar(255), CONSTRAINT pk_log PRIMARY KEY (Idlog) ); INSERT INTO CLIENTE VALUES (1, 'Hugo Batista', TO_DATE('05/02/1990', 'DD/MM/YYYY'), '51898608253'); INSERT INTO CLIENTE VALUES (2, 'José Antonio', TO_DATE('02/05/1985', 'DD/MM/YYYY'), '51144722241'); INSERT INTO CLIENTE VALUES (3, 'João Carlos', TO_DATE('03/05/1993', 'DD/MM/YYYY'), '84882273292'); INSERT INTO CLIENTE VALUES (4, 'Edivaldo Santana', TO_DATE('01/06/2000', 'DD/MM/YYYY'), '30609426176'); INSERT INTO CLIENTE VALUES (5, 'Cristina Oliveira', TO_DATE('16/08/1999', 'DD/MM/YYYY'), '56313586700'); INSERT INTO CLIENTE VALUES (6, 'Artur da Silva', TO_DATE('06/05/2001', 'DD/MM/YYYY'), '67491246583'); INSERT INTO CLIENTE VALUES (7, 'Adrina Domingues', TO_DATE('01/02/1972', 'DD/MM/YYYY'), '22044617250'); INSERT INTO PRODUTO VALUES (1, 'SAMSUNG J7 - PRIME', 10); INSERT INTO PRODUTO VALUES (2, 'SAMSUNG J5 - PRIME', 10); INSERT INTO PRODUTO VALUES (3, 'IPHONE X', 10); INSERT INTO PRODUTO VALUES (4, 'MOTO G 5S', 10); INSERT INTO PRODUTO VALUES (5, 'IPHONE 6S', 10); INSERT INTO PEDIDO VALUES (1, 4, TO_DATE('10/03/2018', 'DD/MM/YYYY'), 1400.99); INSERT INTO ITEMPEDIDO VALUES (1, 1, 800.99, 1, 1); INSERT INTO ITEMPEDIDO VALUES (1, 2, 600.00, 1, 2); INSERT INTO PEDIDO VALUES (2, 2, TO_DATE('17/03/2018', 'DD/MM/YYYY'), 1349.50); INSERT INTO ITEMPEDIDO VALUES (2, 1, 749.50, 1, 4); INSERT INTO ITEMPEDIDO VALUES (2, 2, 600.00, 1, 2); INSERT INTO PEDIDO VALUES (3, 1, TO_DATE('20/03/2018', 'DD/MM/YYYY'), 2590.10); INSERT INTO ITEMPEDIDO VALUES (3, 1, 1800.71, 1, 5); INSERT INTO ITEMPEDIDO VALUES (3, 2, 789.39, 1, 4); INSERT INTO PEDIDO VALUES (4, 5, TO_DATE('21/03/2018', 'DD/MM/YYYY'), 2590.10); INSERT INTO ITEMPEDIDO VALUES (4, 1, 5099.00, 1, 3); INSERT INTO PEDIDO VALUES (5, 7, TO_DATE('10/03/2018', 'DD/MM/YYYY'), 1800.00); INSERT INTO ITEMPEDIDO VALUES (5, 1, 600.00, 3, 2); "Crie um select que exibe quais são os três PRODUTOS com a maior quantidade de PEDIDOS. Exiba o nome e o código do produto"
       
      Oi pessoal. por favor preciso da ajuda de vocês . 
      Eu queria criar um SELECT que exiba os três PRODUTOS com a maior quantidade de PEDIDOS.
      Retornando nome do produto ( PRODUTO.DESCRICAO )  e  o código dele ( PRODUTO.IDPRODUTO )
       
      Eu tentei das seguintes formas mas não consegui . estou novinha ainda em oracle
       
       
      SELECT PRODUTO.DESCRICAO, PRODUTO.IDPRODUTO, ITEMPEDIDO.QUANTIDADE FROM ITEMPEDIDO, PEDIDO, PRODUTO WHERE ITEMPEDIDO.IDPEDIDO = PEDIDO.IDPEDIDO AND PRODUTO.IDPRODUTO = ITEMPEDIDO.IDPRODUTO GROUP BY IDPRODUTO  
      neste código só roda sem erro se eu tirar o GROUP BY IDPRODUTO.  Mas não gera o resultado esperado 

       
      SELECT ITEMPEDIDO.IDPRODUTO, COUNT(*) AS VENDIDO FROM ITEMPEDIDO GROUP BY IDPRODUTO ORDER BY VENDIDO DESC  
       
      Aqui eu até consegui chegar perto mas não consegui acrescentar o nome do produto ( que é PRODUTO.DESCRICAO) e o produto com idproduto 2 ( que é o J5 ) não são só 3 vendidos. SÃO 5 !!! ai ai ai ai
       
      ....e apos muita batalha eu consegui fazer isso ... que tbm ainda não é o ideal
       
      SELECT * FROM (SELECT ITEMPEDIDO.IDPRODUTO, COUNT(*) AS VENDIDO FROM ITEMPEDIDO GROUP BY IDPRODUTO ORDER BY VENDIDO DESC) WHERE ROWNUM <4  

       
      ... demorei horrores pra fazer esse WHERE ROWNUM <4  rodar sem erro... pois é pessoal. só historia triste ! kkkkk
       
       
      Agora estou tentando esse aqui mas não terminei 
       
      SELECT PRODUTO.DESCRICAO AS NOME, ITEMPEDIDO.IDPRODUTO FROM PRODUTO, ITEMPEDIDO WHERE PRODUTO.IDPRODUTO = ITEMPEDIDO.IDPRODUTO
       
       
      acabei parando no meio do caminho e decidi recorrer ao imasters ! 
       
      vou continuar tentando ... sera que consigo antes de alguem aparecer aqui ? rsrsrs
       
      obrigada ! boa sorte pessoal.
       
       
       
      ah ! já ia esquecendo estou usando o livesql.oracle.com
       
      e vou deixar aqui tbm a consulta das tabelas 
       
       

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.