none
Case When + GROUP BY (TOTVS) RRS feed

  • Pergunta

  • Boa tarde pessoal,

    Depois de muito pesquisar consegui consegui demonstrar a quantidade e o valor de titulos a vencer e vencidos buscando da coluna VENCIMENTO(E1_VENCREA),pois bem o problema esta no quando agrupo em CLIENTES,pois o valor dos campos acaba somando,segue abaixo como esta e como gostaria e o codigo sql:

    CLIENTE                           VALOR      SALDO     VENCIDO A VENCER    QTD     QTD A VENCER

    CLIENTE X                 1416,5 1416,5      0         1416,5       0 1

    CLIENTE Y                 1416,5 1416,5      0         1416,5       0 1

    CLIENTE Y                 1416,5 1416,5 1416,5          0       1 0

    Select
      SE1010.E1_NOMCLI,
      Sum(SE1010.E1_VALOR) As E1_VALOR,
      Sum(SE1010.E1_SALDO) As E1_SALDO,
      Case
        When Min(Cast(SE1010.E1_VENCREA As DATETIME)) <= DateAdd(DAY, -0,
        GetDate()) Then Sum(SE1010.E1_SALDO) Else 0 End As [Vr Vencido],
      Case
        When Min(Cast(SE1010.E1_VENCREA As DATETIME)) >= DateAdd(DAY, -0,
        GetDate()) Then Sum(SE1010.E1_SALDO) Else 0 End As [Vr  a Vencer],
      Case
        When Min(Cast(SE1010.E1_VENCREA As DATETIME)) <= DateAdd(DAY, -0,
        GetDate()) Then Count(SE1010.E1_SALDO) Else 0 End As [Qtd Vencido],
      Case
        When Min(Cast(SE1010.E1_VENCREA As DATETIME)) >= DateAdd(DAY, -0,
        GetDate()) Then Count(SE1010.E1_SALDO) Else 0 End As [Qtd  a Vencer]
    From
      SE1010
    Where
      SE1010.E1_SALDO <> '0' And
      SE1010.E1_TIPO <> 'RA' And
      SE1010.D_E_L_E_T_ <> '*'
    Group By
      SE1010.E1_NOMCLI ,E1_VENCREA
    Order By
      SE1010.E1_NOMCLI

    POREM GOSTARIA DESTA FORMA

    CLIENTE                           VALOR      SALDO   VENCIDO A VENCER    QTD     QTD A VENCER

    CLIENTE X                 1416,5 1416,5      0         1416,5       0 1

    CLIENTE Y                 2833,0 2833,0  1416,5        1416,5       1 1

    POREM QUANDO ALTERO O GROUP BY PARA APENAS:

    Group By
      SE1010.E1_NOMCLI 
    Order By
      SE1010.E1_NOMCLI

    ACABA FICANDO ASSIM:

    CLIENTE                           VALOR      SALDO   VENCIDO A VENCER    QTD     QTD A VENCER

    CLIENTE X                 1416,5 1416,5      0         1416,5       0 1

    CLIENTE Y                 2833,0 2833,0    2833,0       2833,0       2 0

    PQ APRESENTA DESTA FORMA?

    QUEM PUDER AJUDAR ,EU AGRADEÇO

    sexta-feira, 24 de outubro de 2014 17:05

Respostas

  • Acho que não deve ser utilizada nenhuma função de agregação (Min, Max, etc) com a coluna E1_VENCREA para poder comparar a data de cada linha com a data atual, e para que isso seja possível, experimente colocar o Case dentro da função Sum. Ex:

      Sum
        (Case When SE1010.E1_VENCREA < CAST(GetDate() AS DATE) Then SE1010.E1_SALDO Else 0 End) As [Vr Vencido],
      Sum
        (Case When SE1010.E1_VENCREA >= CAST(GetDate() AS DATE) Then SE1010.E1_SALDO Else 0 End) As [Vr  a Vencer],
      Count
        (Case When SE1010.E1_VENCREA < CAST(GetDate() AS DATE) Then 1 End) As [Qtd Vencido],
      Count
        (Case When SE1010.E1_VENCREA >= CAST(GetDate() AS DATE) Then 1 End) As [Qtd  a Vencer]

    Não conheço o seu BD mas acredito que a coluna E1_VENCREA seja do tipo Datetime, então removi o Cast pois não seria necessário nesse caso.

    E removi o Else do Case que está dentro do Count para que seja retornado null se a condição não for verdadeira, para que o Count não "conte" a linha.

    Espero que ajude.


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

    sexta-feira, 24 de outubro de 2014 17:53
  • OBRIGADO,

    resolveu meu problema,Para quem um dia precisar segue codigo:

    Select
      SE1010.E1_NOMCLI,
      Sum(SE1010.E1_VALOR) As E1_VALOR,
      Count(SE1010.E1_VALOR) As QTD,
      SUM(SE1010.E1_SALDO) AS E1_SALDO,
       Sum
        (Case When SE1010.E1_VENCREA < CAST(GetDate() AS DATE) Then SE1010.E1_SALDO Else 0 End) As [Vr Vencido],
      Sum
        (Case When SE1010.E1_VENCREA >= CAST(GetDate() AS DATE) Then SE1010.E1_SALDO Else 0 End) As [Vr  a Vencer],
      Count
        (Case When SE1010.E1_VENCREA < CAST(GetDate() AS DATE) Then 1 End) As [Qtd Vencido],
      Count
        (Case When SE1010.E1_VENCREA >= CAST(GetDate() AS DATE) Then 1 End) As [Qtd  a Vencer]
    From
      SE1010
    Where
      SE1010.E1_SALDO <> '0' And
      SE1010.E1_TIPO <> 'RA' And
      SE1010.D_E_L_E_T_ <> '*' 
    Group By
      SE1010.E1_NOMCLI
    Order By
      E1_NOMCLI

    sexta-feira, 24 de outubro de 2014 18:07

Todas as Respostas

  • Boa tarde,

    Milton, de que tipo é a coluna E1_VENCREA? Ela contem também um horário? Ou não contem horário ou é sempre igual a '00:00:00'?


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

    sexta-feira, 24 de outubro de 2014 17:22
  • Amigo o campo é varchar mas eu converto para date e esta sempre com 00:00:00
    sexta-feira, 24 de outubro de 2014 17:29
  • Acho que não deve ser utilizada nenhuma função de agregação (Min, Max, etc) com a coluna E1_VENCREA para poder comparar a data de cada linha com a data atual, e para que isso seja possível, experimente colocar o Case dentro da função Sum. Ex:

      Sum
        (Case When SE1010.E1_VENCREA < CAST(GetDate() AS DATE) Then SE1010.E1_SALDO Else 0 End) As [Vr Vencido],
      Sum
        (Case When SE1010.E1_VENCREA >= CAST(GetDate() AS DATE) Then SE1010.E1_SALDO Else 0 End) As [Vr  a Vencer],
      Count
        (Case When SE1010.E1_VENCREA < CAST(GetDate() AS DATE) Then 1 End) As [Qtd Vencido],
      Count
        (Case When SE1010.E1_VENCREA >= CAST(GetDate() AS DATE) Then 1 End) As [Qtd  a Vencer]

    Não conheço o seu BD mas acredito que a coluna E1_VENCREA seja do tipo Datetime, então removi o Cast pois não seria necessário nesse caso.

    E removi o Else do Case que está dentro do Count para que seja retornado null se a condição não for verdadeira, para que o Count não "conte" a linha.

    Espero que ajude.


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

    sexta-feira, 24 de outubro de 2014 17:53
  • OBRIGADO,

    resolveu meu problema,Para quem um dia precisar segue codigo:

    Select
      SE1010.E1_NOMCLI,
      Sum(SE1010.E1_VALOR) As E1_VALOR,
      Count(SE1010.E1_VALOR) As QTD,
      SUM(SE1010.E1_SALDO) AS E1_SALDO,
       Sum
        (Case When SE1010.E1_VENCREA < CAST(GetDate() AS DATE) Then SE1010.E1_SALDO Else 0 End) As [Vr Vencido],
      Sum
        (Case When SE1010.E1_VENCREA >= CAST(GetDate() AS DATE) Then SE1010.E1_SALDO Else 0 End) As [Vr  a Vencer],
      Count
        (Case When SE1010.E1_VENCREA < CAST(GetDate() AS DATE) Then 1 End) As [Qtd Vencido],
      Count
        (Case When SE1010.E1_VENCREA >= CAST(GetDate() AS DATE) Then 1 End) As [Qtd  a Vencer]
    From
      SE1010
    Where
      SE1010.E1_SALDO <> '0' And
      SE1010.E1_TIPO <> 'RA' And
      SE1010.D_E_L_E_T_ <> '*' 
    Group By
      SE1010.E1_NOMCLI
    Order By
      E1_NOMCLI

    sexta-feira, 24 de outubro de 2014 18:07
  • Que bom que resolveu. 

    Voltando ao Cast para a coluna E1_VENCREA, se essa coluna é do tipo varchar o Cast será necessário.


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

    sexta-feira, 24 de outubro de 2014 18:13