Usuário com melhor resposta
Ajuda com Case Sum

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.
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
Todas as Respostas
-
-
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
-
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.
-
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
-
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.
-
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
-
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.
-
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
-
-
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]
-