Ir para conteúdo
mr22robot

select com condição

Recommended Posts

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

Faz uma exemplo simplificado.

 

Talvez fazendo por Analytic Functions , Rank etc.

 

Mas não sei se entendi o problema.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora

  • Conteúdo Similar

    • Por ILR master
      Boa tarde, pessoal.
      Espero que todos estejam bem.
       
      Seguinte:
      Tenho a seguinte consulta:
       
      $usuarios= "SELECT * FROM usuarios";
      $query= mysqli_query($conexao, $usuarios) or die ("Usuário não encontrado");
      $usuario = mysqli_fetch_array($query);
       
      Quero pegar apenas o campo 'nome' da tabela 'usuarios' e colocar todos os resultados da seguinte forma:
       
      $nomes = array("Rafael", "João", "Maria", "Pedro", "Patricia", "Camila");
       
      Agradeço desde já.
      Abs
       
       
    • Por FabianoSouza
      Eu preciso exibir duas informações em minha consulta:
      1) A quantidade de pessoas inscritas numa turma de treinamento (isso é feito com um simples COUNT)
      2) Uma flag de excesso de inscrições na turma. Seria obtido pela comparação entre a quantidade máxima permitida (já existe esse campo) e o COUNT feito acima.
       
      Até aqui sem problemas.
       
      O que quero é evitar fazer duas contagens (1 para saber a quantidade de inscritos, e outra para gerar a flag de excesso de inscrições).
       
      Há uma forma de utilizar UMA contagem para atender as duas necessidades?
       
      Meu código está assim:
       
      ... --AQUI FAZ A COMPARAÇÃO PARA GERAR A FLAG DE EXCESSO DE INSCRIÇÕES , CASE WHEN (SELECT COUNT(*) FROM dbo.tab AS ITT WHERE ITT.codTurmaDeTreina = T.id) > T.lotacaoMax Then T.nome + '&nbsp;'+'<span class=%22icon-aviso fcolor-critico%22 style=%22font-size:18px%22 title=Excesso&nbsp;de&nbsp;inscrições></span>' --AQUI FAZ A CONTAGEM DE INSCRIÇÕES , (SELECT COUNT(*) FROM dbo.tab AS ITT WHERE ITT.codTurmaDeTreina = T.id) AS 'Inscrições'  
    • Por FabianoSouza
      Possuo uma coluna de data.
      Eu gostaria que os registros com datas futuras aparecessem no topo do meu select, em relação aos demais registros.
      Em seguida, gostaria que somente esses registros com datas futuras ficassem em ordem crescente.
      Algo como 
       
      João  | 16/11/2023
      Maria | 17/11/2023
      José  |  20/11/2023
       
      -----------------------------
      (demais registros da base)
      Antônio   |  20/05/2023
      Rosa        | 15/08/2023
      Cida         | 15/10/2022
      Pedro      |  20/05/2021
      Paulo      |  14/11/2020
       
      O select seria esse.
      select dbo.formataData(ET.dataInicial) AS 'data' FROM dbo.tab AS ET GROUP BY ET.dataInicial  
    • Por FabianoSouza
      Tenho uma function que precisa receber 02 argumentos.
      Ela funciona se eu aplicar num select qualquer. Mas se eu aplicar num select dinâmico, ocorre erro.
      Veja trecho do meu select.
      ... SET @sql = @sql +', dbo.retornaIco_ItemBloq((SELECT COUNT(*) FROM dbo.tab AS TT2 WHERE TT2.codCategTreina = CTT.id),'+@title+') AS ''resp''' ... No caso, o primeiro argumento da function dbo.retornaIco_ItemBloq é um SELECT COUNT.
      O segundo argumento é uma variável (que está devidamente declarada e definida).
       
      O erro ocorre porque ao executar (chamando EXEC(@sql) ), o SQL entende que o segundo argumento é uma coluna da consulta principal, pois existe uma vírgula antes da variável @title (que é o segundo argumento da function).
      Repito. Se eu aplicar essa function num select normal, funciona normalmente. Porém, preciso que funcione num SQL dinâmico porque é esse é o padrão que estou adotando para o sistema todo.
       
      A function dbo.retornaIco_ItemBloq faz o seguinte:
      1) Recebe o valor do COUNT e da variável @title
      2) Se o COUNT for maior que  Zero, cria uma tag HTML (uma SPAN), define sua title com o valor da variável @title e passa para uma variável
      3) Retorna o HTML que será exibido no resultado da consulta principal
      É super simples.
       
      Há outra forma de chamar a function?
    • Por mateus.andriollo
      Existe uma forma de fazer um IF na select e comparar com Array de dados?
       
      algo como
       
      Select if( in_array(idCliente,'1,2,3,4,5')=true,'Tem','Não') ) as cliente Não consigo usar inner ou where pois esse array é algo q tem varias regras...
       
      Precisava saber se existe uma função assim em MySQL
×

Informação importante

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