Jump to content
ferreira12

Calcular resultado total de uma consulta

Recommended Posts

ferreira12

Boas,

Ora bem o que eu pretendia era:

valor Ano

120 2013

100 2012

80 2010

A minha query devolve me isto, mas que agora queria calcular a diferença ou seja

queria usar a seguinte formula (120*100% )/300

em que o 300=120+100+80

a minha dúvida está em conseguir calcular o total do valor os 300

Share this post


Link to post
Share on other sites
Rechousa

Olá,

Aqui vai um exemplo:

DECLARE @Temp TABLE (Valor INT, Ano INT);
INSERT INTO @Temp VALUES (120, 2013), (100, 2012), (80, 2010);

DECLARE @Total DECIMAL(10, 2);
SELECT @Total = SUM(Valor) FROM @Temp;

SELECT Valor, Ano, CAST(Valor / @Total * 100 AS DECIMAL(10, 2)) AS Percentagem
   FROM @Temp;

Antes, fiz um cálculo temporário para obter o total e depois é só dividir.

Aproveita para analisar outras formas de fazer.

Espero ter ajudado,


Pedro Martins

Sharing is Knowledge!

http://www.linkedin.com/in/rechousa

Share this post


Link to post
Share on other sites
ferreira12

Olá,

Os resultados derivam de um union por isso não consigo ir buscar os dados à tabela como no tens no @Temp

Share this post


Link to post
Share on other sites
Rechousa

Por acaso pensei que pudesse ser esse o caso, mas é fácil de resolver - vejo duas formas "simples" de o fazeres:

1) A que me dá ideia de ser mais eficiente:

Crias uma tabela temporária, inseres os registos (usando as tuas queries complexas) para a tabela temporária e retornas os dados da tabela temporária, assim:

DECLARE @Temp TABLE (Valor INT, Ano INT);
DECLARE @Total DECIMAL(10, 2);

INSERT INTO @Temp (Valor, Ano)
-- Aqui colocas a tua query complexa
SELECT Ano, SUM(Valor)
   FROM tabela1
   INNER JOINT tabela2 ON tabela1.xxxx = tabela2.xxxx
   GROUP BY Ano;

SELECT @Total = SUM(Valor) FROM @Temp;
SELECT Valor, Ano, CAST(Valor / @Total * 100 AS DECIMAL(10, 2)) AS Percentagem
   FROM @Temp;

2) Consolidas os dados numa subquery e depois aplicas o cálculo da média, mais ou menos isto:

-- Para calculares o total:
DECLARE @Total DECIMAL(10, 2);
SELECT @Total = SUM(Valor) FROM tabela1
   INNER JOIN tabela2 ON tabela1.xxx = tabela2.xxx;

-- Retorno dos dados incluindo percentagem:
SELECT Valor, Ano, CAST(Valor / @Total * 100 AS DECIMAL(10, 2)) AS Percentagem
   FROM
   (
       SELECT SUM(Valor) AS Valor, Ano, CAST(Valor / @Total * 100 AS DECIMAL(10, 2)) AS Percentagem
      	 FROM tabela1
      	 INNER JOIN tabela2 ON tabela1.xxx = tabela2.xxx
      	 GROUP BY Ano
  ) A;

Espero ter ajudado,

No exemplo usei INNER JOIN's, só depois é que me apercebi que tinhas referido UNION's mas vai dar ao mesmo.

Se tiveres dúvidas avisa

  • Vote 1

Pedro Martins

Sharing is Knowledge!

http://www.linkedin.com/in/rechousa

Share this post


Link to post
Share on other sites
ferreira12

obrigado Rechousa, funcionou prefeitamente.

Mas será que me podes ajudar noutra coisa,

eu tenho a tal tabela

Valor Ano

120 2013

100 2012

80 2010

Estes valores são retornados através de datas, agora suponhamos que eu quero outro consulta de datas para o mesmo ano algo do gênero

valor Valor2 Ano

120 85 2013

100 150 2012

80 30 2010

eu para calcular o campo "valor" utilizo union's como ja havia referido como faço para colocar o campo de "Valor2"

Share this post


Link to post
Share on other sites
xBoShY

Sem declarar variáveis:

Metodo 1:

select tabela.valor, tabela.ano, cast((tabela.valor / soma.valor) * 100 as decimal(10, 2)) as percentagem
from tabela, (select sum(valor) as valor from tabela) as soma

Metodo 2:

with soma as (select sum(valor) as valor from tabela)
select tabela.valor, tabela.ano, cast((tabela.valor / soma.valor) * 100 as decimal(10, 2)) as percentagem
from tabela, soma

Edited by xBoShY

Share this post


Link to post
Share on other sites
ferreira12

E colocar uma nova coluna como postei no post anterior alguém me consegue ajudar!!!

Share this post


Link to post
Share on other sites
ferreira12

Eu estou a usar um filtro de data através de um função...

Exemplo 1 de janeiro a 2 de janeiro pelos anos 2013,2012,2010...

Eu aqui uso as funções atraves de union's, só que agora queria que essas mesma funçoes retornassem um novo filtro de data por exemplo 1 de Fevereiro a 2 de Fevereiro pelos anos 2013,2012,2010...

o que daria:

algo como isto

valorJAN ValorFEV Ano

120 85 2013

100 150 2012

80 30 2010

Share this post


Link to post
Share on other sites
ferreira12

Estou a tentar mas sem sucesso

SELECT
Anos.GetDate() as Ano3, GetDate()-1 as Ano2,
DiaHoje.Valor as ValorHoje, DiaHoje.qnt as qntHoje,
DiaOntem.Valor as ValorOntem, DiaOntem.qnt as qntOntem
from fnResumo('07-15-2013 00:01','07-15-2013 23:59') as Anos
LEFT JOIN
(
select Year(Getdate()) as Ano1 ,Sum(Valor) as Valor1,SUM(qnt) as qnt1
from dbo.fnResumo('07-15-2013 00:01','07-15-2013 23:59') ) AS DiaHoje
on Anos.Ano3=Diahoje.Ano1
LEFT JOIN
(
select Year(Getdate())-1 as Ano2, Sum(Valor) as valor2, Sum(qnt) as qnt2
from dbo.fnResumo('07-15-2012 00:01','07-15-2012 23:59')) AS DiaOntem
on Ano2=Diaontem.Ano2
--where vendasHoje.Site is not null or vendasOntem.Site is not null

Está me a dizer colunia invalid nestas duas partes do código

on Anos.Ano3=Diahoje.Ano1
on Anos.Ano2=Diaontem.Ano2

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.