ferreira12 Posted July 11, 2013 at 05:13 PM Report #518369 Posted July 11, 2013 at 05:13 PM 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
Rechousa Posted July 11, 2013 at 06:44 PM Report #518401 Posted July 11, 2013 at 06:44 PM 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
ferreira12 Posted July 12, 2013 at 08:59 AM Author Report #518467 Posted July 12, 2013 at 08:59 AM Olá, Os resultados derivam de um union por isso não consigo ir buscar os dados à tabela como no tens no @Temp
Rechousa Posted July 12, 2013 at 10:17 AM Report #518482 Posted July 12, 2013 at 10:17 AM 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 1 Report Pedro Martins Sharing is Knowledge! http://www.linkedin.com/in/rechousa
ferreira12 Posted July 12, 2013 at 01:38 PM Author Report #518504 Posted July 12, 2013 at 01:38 PM 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"
xBoShY Posted July 14, 2013 at 02:00 AM Report #518674 Posted July 14, 2013 at 02:00 AM (edited) 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 July 14, 2013 at 02:01 AM by xBoShY
ferreira12 Posted July 14, 2013 at 08:50 PM Author Report #518742 Posted July 14, 2013 at 08:50 PM E colocar uma nova coluna como postei no post anterior alguém me consegue ajudar!!!
xBoShY Posted July 15, 2013 at 12:42 AM Report #518752 Posted July 15, 2013 at 12:42 AM donde vem essa coluna? convem saber o esquema das tabelas/views =)
ferreira12 Posted July 15, 2013 at 08:09 AM Author Report #518758 Posted July 15, 2013 at 08:09 AM 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
ferreira12 Posted July 16, 2013 at 11:19 AM Author Report #518907 Posted July 16, 2013 at 11:19 AM 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
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now