none
Ajuda com Case Sum RRS feed

  • Pergunta

  • Fala pessoal, estou com um problema, preciso criar uma consulta que realize a soma de dois campos quando as datas forem iguais.

    Mas estou tento dificuldade pra faze-lo. 

    declare @dthji datetime, @dthjf datetime;
    set @dthji= Convert(datetime, '1/1/2015', 103);
    set @dthjf= Convert(datetime, '31/1/2015', 103);
    
    select TD.DataV,TD.Par,TD.Po,TD.DiuDeci,TD.NotDeci,TD.id_ae,TD.jornIni,TD.jornRefIni,
    TD.jornRefFin,TD.jornFina,TM.Modelo,TD.Num_Diario, td.Nome_P,
    -- esses dois campos preciso somar quando o campo td.DataV as datas forem iguais.
     SUM (TD.DiuDeci +TD.NotDeci) 
    
    from Tbl_DiarioF as TD inner join Tbl_Ae as TA on TA.id_ae = TD.id_ae
    inner join Tbl_Modelo as TM on TM.id_ModAe = TA.id_modAe
    where td.Nome_P = 'felipe' and td.DataV between @dthji and @dthjf 

    Desde já agradeço quem puder me ajudar.

    Att, wsti.

    domingo, 24 de janeiro de 2016 00:54

Respostas

  • Experimente utilizar o Sum com a clausula Over para ver se é obtido o resultado esperado:

    select TD.DataV,TD.Par,TD.Po,TD.DiuDeci,TD.NotDeci,TD.id_ae,TD.jornIni,TD.jornRefIni,
    TD.jornRefFin,TD.jornFina,TM.Modelo,TD.Num_Diario, td.Nome_P,
    SUM(TD.DiuDeci +TD.NotDeci) OVER(PARTITION BY TD.DataV) as Subtotal
    
    from Tbl_DiarioF as TD inner join Tbl_Ae as TA on TA.id_ae = TD.id_ae
    inner join Tbl_Modelo as TM on TM.id_ModAe = TA.id_modAe
    where td.Nome_P = 'felipe' and td.DataV between @dthji and @dthjf 

    Espero que ajude


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

    • Marcado como Resposta Wsti domingo, 24 de janeiro de 2016 23:21
    domingo, 24 de janeiro de 2016 23:09

Todas as Respostas

  • Ninguem ?!?!?
    domingo, 24 de janeiro de 2016 17:02
  • Wsti,

    Acredito que a cláusula CASE possa te ajudar a solucionar o seu problema.

    Já tentou utilizá-la?

    Segue abaixo referência sobre a cláusula CASE e também um exemplo de código de como utilizá-la.

    Só não entendi muito bem quais os campos/variáveis você deseja comparar.

    Referência: https://msdn.microsoft.com/pt-br/library/ms181765(v=sql.120).aspx

    Exemplo:

    declare @dthji datetime, @dthjf datetime;
    set @dthji= Convert(datetime, '1/1/2015', 103);
    set @dthjf= Convert(datetime, '31/1/2015', 103);
    
    select TD.DataV,TD.Par,TD.Po,TD.DiuDeci,TD.NotDeci,TD.id_ae,TD.jornIni,TD.jornRefIni,
    TD.jornRefFin,TD.jornFina,TM.Modelo,TD.Num_Diario, td.Nome_P,
    -- esses dois campos preciso somar quando o campo td.DataV as datas forem iguais.
    CASE 
    WHEN ((td.DataV = @dthji) AND (td.DataV = @dthjf)) THEN SUM (TD.DiuDeci +TD.NotDeci)
    ELSE TD.DiuDeci END AS NomedoCampo
    from Tbl_DiarioF as TD inner join Tbl_Ae as TA on TA.id_ae = TD.id_ae
    inner join Tbl_Modelo as TM on TM.id_ModAe = TA.id_modAe
    where td.Nome_P = 'felipe' and td.DataV between @dthji and @dthjf 

    Espero ter ajudado..


    Felipe Lauffer MCSA: SQL Server | MCP

    domingo, 24 de janeiro de 2016 17:40
  • Oi Felipe, obrigado pela resposta. 

    O que preciso é somar esses dois campos  

    Sum (TD>DIUDECI + TD>NOTDECI)

    aonde as datas forem iguais, exemplo tenho 4 registros do dia 20/01/2016 e um do dia 19/01

    então 

    19/01/2016     diudeci = 0,0   notdeci = 10,0

    20/01/2016    diudeci = 12,0   notedeci = 0,0

    20/01/2016    diudeci = 9,0     notedeci = 0,0

    20/01/2016    diudeci = 0,0   notedeci = 10,0

    20/01/2016    diudeci = 9,0     notedeci = 11,0

    o resultado seria 

    19/01/2016   = total = 10,0    pois só tem um registro 

    20/10/2016   = total  51,0    soma dos 4 registros 


    Att, wsti.


    domingo, 24 de janeiro de 2016 18:12
  • Boa tarde,

    Não sei se entendi corretamente, mas experimente dessa forma:

    select TD.DataV, SUM(TD.DiuDeci +TD.NotDeci) as Total
    from Tbl_DiarioF as TD 
    where 
        td.Nome_P = 'felipe' and 
        td.DataV between @dthji and @dthjf 
    group by TD.DataV

    Espero que ajude


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

    domingo, 24 de janeiro de 2016 21:27
  • Oi gapimex, assim funciona.

    Mas como poderia ser feito nesse modelo 

    declare @dthji datetime, @dthjf datetime;
    set @dthji= Convert(datetime, '1/1/2015', 103);
    set @dthjf= Convert(datetime, '31/1/2015', 103);
    
    select TD.DataV,TD.Par,TD.Po,TD.DiuDeci,TD.NotDeci,TD.id_ae,TD.jornIni,TD.jornRefIni,
    TD.jornRefFin,TD.jornFina,TM.Modelo,TD.Num_Diario, td.Nome_P,
    -- esses dois campos preciso somar quando o campo td.DataV as datas forem iguais.
    CASE 
    WHEN ((td.DataV = @dthji) AND (td.DataV = @dthjf)) THEN SUM (TD.DiuDeci +TD.NotDeci)
    ELSE TD.DiuDeci END AS NomedoCampo
    from Tbl_DiarioF as TD inner join Tbl_Ae as TA on TA.id_ae = TD.id_ae
    inner join Tbl_Modelo as TM on TM.id_ModAe = TA.id_modAe
    where td.Nome_P = 'felipe' and td.DataV between @dthji and @dthjf 

    cheguei a tentar montar um CTE mas não tive sucesso. 

    ;with CTE_D as( select DataV,Par,Pou,DiuDeci,NotDeci,id_ae,jornIni,jornRefIni,jornRefFin,jornFina,Num_Dia,Nome_P,Total 
    from Tbl_DiarioF where DataV between @dthji and @dthjf group by DataV,Par,Pou,DiuDeci,NotDeci,id_ae,jornIni,jornRefIni,jornRefFin,jornFina,
    Num_Dia,Nome_P,Total),
    CTE_A as ( select id_ae,id_modAe  from Tbl_Ae ),
    CTE_M as( select id_Mod,Modelo from Tbl_ModeloAe)
    select D.DataV,D.Par,D.Pou,D.DiuDeci,D.NotDeci,D.id_ae,D.jornIni,D.jornRefIni,D.jornRefFin,D.jornFina,M.Modelo,D.Num_Dia,D.Nome_P ,D.Total,
    case when DATEPART(day, D.DataV) = 1 then sum (D.Total) when DATEPART(day, D.DataV) = 2 then sum (D.Total) 
    when DATEPART(day, D.DataV) = 3 then sum (D.Total) when DATEPART(day, D.DataV) = 4 then sum (D.Total) 
    when DATEPART(day, D.DataV) = 5 then sum (D.Total) when DATEPART(day, D.DataV) = 6 then sum (D.Total) 
    when DATEPART(day, D.DataV) = 7 then sum (D.Total) when DATEPART(day, D.DataV) = 8 then sum (D.Total) 
    when DATEPART(day, D.DataV) = 9 then sum (D.Total) when DATEPART(day, D.DataV) = 10 then sum (D.Total) 
    when DATEPART(day, D.DataV) = 11 then sum (D.Total) when DATEPART(day, D.DataV) = 12 then sum (D.Total) 
    when DATEPART(day, D.DataV) = 13 then sum (D.Total) when DATEPART(day, D.DataV) = 14 then sum (D.Total) 
    when DATEPART(day, D.DataV) = 15 then sum (D.Total) when DATEPART(day, D.DataV) = 16 then sum (D.Total) 
    when DATEPART(day, D.DataV) = 17 then sum (D.Total) when DATEPART(day, D.DataV) = 18 then sum (D.Total) 
    when DATEPART(day, D.DataV) = 19 then sum (D.Total) when DATEPART(day, D.DataV) = 20 then sum (D.Total) 
    when DATEPART(day, D.DataV) = 21 then sum (D.Total) when DATEPART(day, D.DataV) = 22 then sum (D.Total) 
    when DATEPART(day, D.DataV) = 23 then sum (D.Total) when DATEPART(day, D.DataV) = 24 then sum (D.Total) 
    when DATEPART(day, D.DataV) = 25 then sum (D.Total) when DATEPART(day, D.DataV) = 26 then sum (D.Total) 
    when DATEPART(day, D.DataV) = 27 then sum (D.Total) when DATEPART(day, D.DataV) = 28 then sum (D.Total) 
    when DATEPART(day, D.DataV) = 29 then sum (D.Total) when DATEPART(day, D.DataV) = 30 then sum (D.Total) 
    when DATEPART(day, D.DataV) = 31 then sum (D.Total)end as subtotal    
    
    from CTE_D as D full join CTE_A as A on A.id_ae = D.id_ae inner join 
    CTE_M as M on  M.id_ModAe = A.id_modA where D.Nome_P = 'felipe' and D.DataV between @dthji and @dthjf
    
    group by D.DataV,D.Part,D.Pou,D.DiuDeci,D.NotDeci,D.id_ae,D.jornIni,D.jornRefIni,D.jornRefFin,D.jornFina,
    D.Num_Dia,D.Nome_P,D.Total,M.Modelo

    Att, wsti.

    domingo, 24 de janeiro de 2016 21:41
  • Não consegui entender como você quer que fique o resultado.

    Acho que seria melhor você postar uma amostra do resultado retornado pela query que você postou na abertura do tópico sem o Sum, e como gostaria que ficasse o resultado para facilitar o entendimento da questão.


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

    domingo, 24 de janeiro de 2016 21:50
  • Oi Gapimex, primeiramente obrigado pro me ajudar. 

    o resultado da query que vc postou é esse.

    realizou a soma dos campos agrupando pelo dia. 

    a CTE que postei me dá o seguinte resultado.

    veja que o dia 02/01/2015  existe 3 registros. o que precisava é que viesse  com as colunas como estão acima mas um campo  com a soma dos totais,  então os resultados do dia 02/01/2016 a ultima coluna que é subtotal receberia 1,70 que é a soma dos campos Diudec e NotDeci .

    Att, wsti.

    domingo, 24 de janeiro de 2016 22:05
  • Experimente utilizar o Sum com a clausula Over para ver se é obtido o resultado esperado:

    select TD.DataV,TD.Par,TD.Po,TD.DiuDeci,TD.NotDeci,TD.id_ae,TD.jornIni,TD.jornRefIni,
    TD.jornRefFin,TD.jornFina,TM.Modelo,TD.Num_Diario, td.Nome_P,
    SUM(TD.DiuDeci +TD.NotDeci) OVER(PARTITION BY TD.DataV) as Subtotal
    
    from Tbl_DiarioF as TD inner join Tbl_Ae as TA on TA.id_ae = TD.id_ae
    inner join Tbl_Modelo as TM on TM.id_ModAe = TA.id_modAe
    where td.Nome_P = 'felipe' and td.DataV between @dthji and @dthjf 

    Espero que ajude


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

    • Marcado como Resposta Wsti domingo, 24 de janeiro de 2016 23:21
    domingo, 24 de janeiro de 2016 23:09
  • Gapimex, funcionou !!

    Muito Obrigado pela sua ajuda!!

    []' Wsti.

    domingo, 24 de janeiro de 2016 23:21
  • Wsti,

    Se você estiver utilizando o SQL Server 2012 ou 2014 uma alternativa seria utilizar a função IIF diretamente no seu select, onde será totalmente possível realizar esta análise condiciona e de acordo com a condição estabelecer o resultado.


    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]

    terça-feira, 26 de janeiro de 2016 13:42
  • Oi Junior, obrigado pela resposta, mas estou usando o 2008. 

    Att, wsti.

    quinta-feira, 28 de janeiro de 2016 12:12