none
CASE com IF RRS feed

  • Pergunta

  • Boa tarde

    tenho a seguinte situação

    Preciso comparar duas datas e no final temos a seguinte situação

    tabela 1 - solicitação de compra

    1- Cod solic

    2- Criticidade ( 1-Normal / 2 -Emergencial)

    3-Cod Produto

    4- data solic

    tabela 2 - pedido de compra

    1- cod pedido

    2- valor

    3-data pedido

    Situação:

    IF (Data solicit - Data pedido) <= 10 and criticidade = normal

    contar  o numero de vezes que aconteceu. com esse criterio

    IF (Data solicit - Data pedido) <= 6 and criticidade = emergencial

    contar  o numero de vezes que aconteceu. com esse criterio

    quarta-feira, 27 de julho de 2016 18:33

Respostas

  • Experimente fazer uns testes mais ou menos dessa forma:

    with CTE_DateDiff as
    (
        select
            datediff(day, s.DataSolic, p.DataPedido) as QtdeDias,
            s.Criticidade
        from TblPedidos as p
        inner join TblSolicitacoes as s
            on s.CodSolic = p.CodSolic
    )
    
    select
        count(case when Criticidade = 1 then 1 end) as Normal,
        count(case when QtdeDias <= 6 and Criticidade = 2 then 1 end) as Emergencial
    from CTE_DateDiff
    where
        QtdeDias <= 10

    Espero que ajude


    Assinatura: http://www.imoveisemexposicao.com.br

    quarta-feira, 27 de julho de 2016 20:10
  • Bom dia,

    Considerando que devem ser consideradas eventuais solicitações sem pedido, e que nesses casos deve ser utilizada a data atual para calcular a quantidade de dias, experimente mais ou menos dessa forma:

    with CTE_DateDiff as
    (
        select
            datediff(day, s.DataSolic, coalesce(p.DataPedido, current_timestamp)) as QtdeDias,
            s.Criticidade
        from TblSolicitacoes as s 
        left join TblPedidos as p
            on p.CodSolic = s.CodSolic
    )
    
    select
        count(case when QtdeDias <= 10 and Criticidade = 1 then 1 end) as Normal,
        count(case when QtdeDias <= 6 and Criticidade = 2 then 1 end) as Emergencial,
        count(1) as Total
    from CTE_DateDiff
    
        

     Espero que ajude

    Assinatura: http://www.imoveisemexposicao.com.br

    sexta-feira, 29 de julho de 2016 14:54

Todas as Respostas

  • Gildo,

    Acredito que você poderia aplicar esta lógico no seu Select fazendo uso do comando Case.

    A partir do SQL Server 2012 podemos utilizar o comando IIF dentro do bloco Select, também pode ser uma solução.

    Sua dúvida esta em como montar esta condição dentro do Select? Eu particularmente para este tipo de cenário prefiro utilizar o Case.

    Agora outra possibildade seria fazer uso da função DateDiff ou DateAdd dentro do Select em conjunto com o Case, veja se este exemplo ajuda:

    Declare @DataAnterior Date,
            @DataAtual Date = GetDate()
    
    Set @DataAnterior=GetDate()-5
    
    Select Case(DATEDIFF(d,@DataAnterior,@DataAtual))
            When 1 Then 'Um dia'
    		When 5 Then 'Cinco Dias'
    		When 10 then 'Dez dias'
    	   End Comparacao


    Pedro Antonio Galvao Junior [MVP | MCC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitario | SoroCodigos | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    quarta-feira, 27 de julho de 2016 18:49
  • Obrigado pela resposta

    Preciso contar o numero de vezes que cadas condição acima ocorreu

    quarta-feira, 27 de julho de 2016 18:52
  • Gildo,

    Então neste caso, você vai poder fazer o Select de acordo com a diferença de dias, algo similar a isso:

    Declare @DataAnterior Date,
            @DataAtual Date = GetDate()
    
    Set @DataAnterior=GetDate()-5
    
    Select Case(DATEDIFF(d,@DataAnterior,@DataAtual))
            When 1 Then (Select Count(*) from ..... Where .....)
    		When 5 Then (Select Count(*) from ..... Where .....)
    		When 10 then (Select Count(*) from ..... Where .....)
    	   End Comparacao


    Pedro Antonio Galvao Junior [MVP | MCC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitario | SoroCodigos | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    quarta-feira, 27 de julho de 2016 19:12
  • Boa tarde,

    gildo_santos, qual(is) coluna(s) deve(m) ser utilizada(s) para fazer o relacionamento entre a tabela de solicitação de compra e a tabela de pedido de compra?


    Assinatura: http://www.imoveisemexposicao.com.br

    quarta-feira, 27 de julho de 2016 19:15
  • na tabela de pedido tem um campo cod_solict
    quarta-feira, 27 de julho de 2016 19:49
  • Experimente fazer uns testes mais ou menos dessa forma:

    with CTE_DateDiff as
    (
        select
            datediff(day, s.DataSolic, p.DataPedido) as QtdeDias,
            s.Criticidade
        from TblPedidos as p
        inner join TblSolicitacoes as s
            on s.CodSolic = p.CodSolic
    )
    
    select
        count(case when Criticidade = 1 then 1 end) as Normal,
        count(case when QtdeDias <= 6 and Criticidade = 2 then 1 end) as Emergencial
    from CTE_DateDiff
    where
        QtdeDias <= 10

    Espero que ajude


    Assinatura: http://www.imoveisemexposicao.com.br

    quarta-feira, 27 de julho de 2016 20:10
  • Boa tarde

    Realmente ficou muito bom, mais preciso de mais um informação..

    Saber o numero total de solicitações de compra .. por exemplo

    teve 10 solicitações no total

     e 5 foram dentro critério  criticidade = 5 e dias <6

    e  5 foram foram do critério 

    obrigado 

    sexta-feira, 29 de julho de 2016 14:19
  • Bom dia,

    Considerando que devem ser consideradas eventuais solicitações sem pedido, e que nesses casos deve ser utilizada a data atual para calcular a quantidade de dias, experimente mais ou menos dessa forma:

    with CTE_DateDiff as
    (
        select
            datediff(day, s.DataSolic, coalesce(p.DataPedido, current_timestamp)) as QtdeDias,
            s.Criticidade
        from TblSolicitacoes as s 
        left join TblPedidos as p
            on p.CodSolic = s.CodSolic
    )
    
    select
        count(case when QtdeDias <= 10 and Criticidade = 1 then 1 end) as Normal,
        count(case when QtdeDias <= 6 and Criticidade = 2 then 1 end) as Emergencial,
        count(1) as Total
    from CTE_DateDiff
    
        

     Espero que ajude

    Assinatura: http://www.imoveisemexposicao.com.br

    sexta-feira, 29 de julho de 2016 14:54
  • Bom dia,

    Considerando que devem ser consideradas eventuais solicitações sem pedido, e que nesses casos deve ser utilizada a data atual para calcular a quantidade de dias, experimente mais ou menos dessa forma:

    with CTE_DateDiff as
    (
        select
            datediff(day, s.DataSolic, coalesce(p.DataPedido, current_timestamp)) as QtdeDias,
            s.Criticidade
        from TblSolicitacoes as s 
        left join TblPedidos as p
            on p.CodSolic = s.CodSolic
    )
    
    select
        count(case when QtdeDias <= 10 and Criticidade = 1 then 1 end) as Normal,
        count(case when QtdeDias <= 6 and Criticidade = 2 then 1 end) as Emergencial,
        count(1) as Total
    from CTE_DateDiff
    
        

     Espero que ajude

    Assinatura: http://www.imoveisemexposicao.com.br

    Gapimex,

    Só um detalhe eu não faria uso do Case dentro do Count, particularmente eu faria a contagem para cada condição do Case se for necessário.


    Pedro Antonio Galvao Junior [MVP | MCC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitario | SoroCodigos | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    sexta-feira, 29 de julho de 2016 15:14