Tesla Posted November 25, 2009 at 04:23 PM Report Share #297550 Posted November 25, 2009 at 04:23 PM SELECT (SELECT conta FROM pcsa WHERE mes=1 and ano=2009 and conta=temp1.conta and temp1.mes=1 and temp1.ano=2009) as 'Janeiro' , (SELECT cre-deb FROM pcsa WHERE mes=1 and ano=2009 and conta=temp1.conta and temp1.mes=1 and temp1.ano=2009) as 'saldojan' , (SELECT (((SELECT cre-deb FROM pcsa WHERE mes=1 and ano=2009 and conta=temp1.conta and temp1.mes=1 and temp1.ano=2009)-(SELECT cre-deb FROM pcsa WHERE mes=12 and ano=2008 and conta=temp1.conta))/(SELECT cre-deb FROM pcsa WHERE mes=12 and ano=2008 and conta=temp1.conta))) as 'desviojan' , (SELECT conta FROM pcsa WHERE mes=2 and ano=2009 and conta=temp1.conta and temp1.mes=2 and temp1.ano=2009) as 'Fevereiro' , (SELECT cre-deb FROM pcsa WHERE mes=2 and ano=2009 and conta=temp1.conta and temp1.mes=2 and temp1.ano=2009) as 'saldofev' , (SELECT (((SELECT cre-deb FROM pcsa WHERE mes=2 and ano=2009 and conta=temp1.conta and temp1.mes=2 and temp1.ano=2009)-(SELECT cre-deb FROM pcsa WHERE mes=1 and ano=2009 and conta=temp1.conta))/(SELECT cre-deb FROM pcsa WHERE mes=1 and ano=2009 and conta=temp1.conta))) as 'desviofev' , (SELECT conta FROM pcsa WHERE mes=3 and ano=2009 and conta=temp1.conta and temp1.mes=3 and temp1.ano=2009) as 'Marco' , (SELECT cre-deb FROM pcsa WHERE mes=3 and ano=2009 and conta=temp1.conta and temp1.mes=3 and temp1.ano=2009) as 'saldomar' , (SELECT (((SELECT cre-deb FROM pcsa WHERE mes=3 and ano=2009 and conta=temp1.conta and temp1.mes=3 and temp1.ano=2009)-(SELECT cre-deb FROM pcsa WHERE mes=2 and ano=2009 and conta=temp1.conta))/(SELECT cre-deb FROM pcsa WHERE mes=2 and ano=2009 and conta=temp1.conta))) as 'desviomar' , (SELECT conta FROM pcsa WHERE mes=4 and ano=2009 and conta=temp1.conta and temp1.mes=4 and temp1.ano=2009) as 'Abril' , (SELECT cre-deb FROM pcsa WHERE mes=4 and ano=2009 and conta=temp1.conta and temp1.mes=4 and temp1.ano=2009) as 'saldoabr' , (SELECT (((SELECT cre-deb FROM pcsa WHERE mes=4 and ano=2009 and conta=temp1.conta and temp1.mes=4 and temp1.ano=2009)-(SELECT cre-deb FROM pcsa WHERE mes=3 and ano=2009 and conta=temp1.conta))/(SELECT cre-deb FROM pcsa WHERE mes=3 and ano=2009 and conta=temp1.conta))) as 'desvioabr' , (SELECT conta FROM pcsa WHERE mes=5 and ano=2009 and conta=temp1.conta and temp1.mes=5 and temp1.ano=2009) as 'Maio' , (SELECT cre-deb FROM pcsa WHERE mes=5 and ano=2009 and conta=temp1.conta and temp1.mes=5 and temp1.ano=2009) as 'saldomai' , (SELECT (((SELECT cre-deb FROM pcsa WHERE mes=5 and ano=2009 and conta=temp1.conta and temp1.mes=5 and temp1.ano=2009)-(SELECT cre-deb FROM pcsa WHERE mes=4 and ano=2009 and conta=temp1.conta))/(SELECT cre-deb FROM pcsa WHERE mes=4 and ano=2009 and conta=temp1.conta))) as 'desviomai' , (SELECT conta FROM pcsa WHERE mes=6 and ano=2009 and conta=temp1.conta and temp1.mes=6 and temp1.ano=2009) as 'Junho' , (SELECT cre-deb FROM pcsa WHERE mes=6 and ano=2009 and conta=temp1.conta and temp1.mes=6 and temp1.ano=2009) as 'saldojun' , (SELECT (((SELECT cre-deb FROM pcsa WHERE mes=6 and ano=2009 and conta=temp1.conta and temp1.mes=6 and temp1.ano=2009)-(SELECT cre-deb FROM pcsa WHERE mes=5 and ano=2009 and conta=temp1.conta))/(SELECT cre-deb FROM pcsa WHERE mes=5 and ano=2009 and conta=temp1.conta))) as 'desviojun' , (SELECT conta FROM pcsa WHERE mes=7 and ano=2009 and conta=temp1.conta and temp1.mes=7 and temp1.ano=2009) as 'Julho' , (SELECT cre-deb FROM pcsa WHERE mes=7 and ano=2009 and conta=temp1.conta and temp1.mes=7 and temp1.ano=2009) as 'saldojul' , (SELECT (((SELECT cre-deb FROM pcsa WHERE mes=7 and ano=2009 and conta=temp1.conta and temp1.mes=7 and temp1.ano=2009)-(SELECT cre-deb FROM pcsa WHERE mes=6 and ano=2009 and conta=temp1.conta))/(SELECT cre-deb FROM pcsa WHERE mes=6 and ano=2009 and conta=temp1.conta))) as 'desviojul' , (SELECT conta FROM pcsa WHERE mes=8 and ano=2009 and conta=temp1.conta and temp1.mes=8 and temp1.ano=2009) as 'Agosto' , (SELECT cre-deb FROM pcsa WHERE mes=8 and ano=2009 and conta=temp1.conta and temp1.mes=8 and temp1.ano=2009) as 'saldoago' , (SELECT (((SELECT cre-deb FROM pcsa WHERE mes=8 and ano=2009 and conta=temp1.conta and temp1.mes=8 and temp1.ano=2009)-(SELECT cre-deb FROM pcsa WHERE mes=7 and ano=2009 and conta=temp1.conta))/(SELECT cre-deb FROM pcsa WHERE mes=7 and ano=2009 and conta=temp1.conta))) as 'desvioago' , (SELECT conta FROM pcsa WHERE mes=9 and ano=2009 and conta=temp1.conta and temp1.mes=9 and temp1.ano=2009) as 'Setembro' , (SELECT cre-deb FROM pcsa WHERE mes=9 and ano=2009 and conta=temp1.conta and temp1.mes=9 and temp1.ano=2009) as 'saldoset' , (SELECT (((SELECT cre-deb FROM pcsa WHERE mes=9 and ano=2009 and conta=temp1.conta and temp1.mes=9 and temp1.ano=2009)-(SELECT cre-deb FROM pcsa WHERE mes=8 and ano=2009 and conta=temp1.conta))/(SELECT cre-deb FROM pcsa WHERE mes=8 and ano=2009 and conta=temp1.conta))) as 'desvioset' , (SELECT conta FROM pcsa WHERE mes=10 and ano=2009 and conta=temp1.conta and temp1.mes=10 and temp1.ano=2009) as 'Outubro' , (SELECT cre-deb FROM pcsa WHERE mes=10 and ano=2009 and conta=temp1.conta and temp1.mes=10 and temp1.ano=2009) as 'saldoout' , (SELECT (((SELECT cre-deb FROM pcsa WHERE mes=10 and ano=2009 and conta=temp1.conta and temp1.mes=10 and temp1.ano=2009)-(SELECT cre-deb FROM pcsa WHERE mes=9 and ano=2009 and conta=temp1.conta))/(SELECT cre-deb FROM pcsa WHERE mes=9 and ano=2009 and conta=temp1.conta))) as 'desvioout' , (SELECT conta FROM pcsa WHERE mes=11 and ano=2009 and conta=temp1.conta and temp1.mes=11 and temp1.ano=2009) as 'Novembro' , (SELECT cre-deb FROM pcsa WHERE mes=11 and ano=2009 and conta=temp1.conta and temp1.mes=11 and temp1.ano=2009) as 'saldonov' , (SELECT (((SELECT cre-deb FROM pcsa WHERE mes=11 and ano=2009 and conta=temp1.conta and temp1.mes=11 and temp1.ano=2009)-(SELECT cre-deb FROM pcsa WHERE mes=10 and ano=2009 and conta=temp1.conta))/(SELECT cre-deb FROM pcsa WHERE mes=10 and ano=2009 and conta=temp1.conta))) as 'desvionov' , (SELECT conta FROM pcsa WHERE mes=12 and ano=2009 and conta=temp1.conta and temp1.mes=12 and temp1.ano=2009) as 'Dezembro' , (SELECT cre-deb FROM pcsa WHERE mes=12 and ano=2009 and conta=temp1.conta and temp1.mes=12 and temp1.ano=2009) as 'saldodez' , (SELECT (((SELECT cre-deb FROM pcsa WHERE mes=12 and ano=2009 and conta=temp1.conta and temp1.mes=12 and temp1.ano=2009)-(SELECT cre-deb FROM pcsa WHERE mes=11 and ano=2009 and conta=temp1.conta))/(SELECT cre-deb FROM pcsa WHERE mes=11 and ano=2009 and conta=temp1.conta))) as 'desviodez' FROM (SELECT * FROM pcsa WHERE ano=2009 AND mes BETWEEN 1 AND 12) temp1 ORDER BY temp1.mes, temp1.conta Olá! O código acima produz a informação que quero, mas na formatação que não quero. A formatação assemelha-se muito à Matriz Identidade. Onde os 1's correspondem à informação pretendida. Gostaria de saber o que fazer para colocar os "1's" todos na primeira linha, isto é, como posso fazer com que o output da query seja uma tabela totalmente organizada e não uma matriz? Obrigado pela ajuda. Abraço. Assinatura editada pelo staff, por favor consulte as regras. Link to comment Share on other sites More sharing options...
M6 Posted November 26, 2009 at 02:27 PM Report Share #297623 Posted November 26, 2009 at 02:27 PM Assim de repente parece-me que essa query é extremamente ineficaz e pode ser rescrita com um select e um group by... Performance à parte, não percebi o que queres fazer, ASCII/SQL Art?!? Não percebi nada dos 1s na primeira linha, além disso o resultado de um select é uma tabela (dito de forma lata), pelo que poder usar o order by para ordenar o resultado como pretendes. 10 REM Generation 48K! 20 INPUT "URL:", A$ 30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50 40 PRINT "404 Not Found" 50 PRINT "./M6 @ Portugal a Programar." Link to comment Share on other sites More sharing options...
Tesla Posted November 26, 2009 at 08:24 PM Author Report Share #297674 Posted November 26, 2009 at 08:24 PM Boas. Já encontrei a solução, no entanto vou colocá-la aqui para apreciação do código já que acredito que não seja muito eficiente. Amanhã coloco. O objectivo da query é criar um Balancete de saldos para um determinado ano e para todos os meses, acrescentando entre cada mês uma coluna com um desvio percentual de saldo calculado entre o mês da coluna e o mês exactamente anterior. Abraço. Assinatura editada pelo staff, por favor consulte as regras. Link to comment Share on other sites More sharing options...
Tesla Posted November 30, 2009 at 10:09 AM Author Report Share #298053 Posted November 30, 2009 at 10:09 AM SELECT DISTINCT conta , Saldo_Jan=(SELECT cre-deb FROM pcsa WHERE ano=#1# and mes=1 and conta=temp1.conta) , Desvio_Jan=CAST(CAST(100*(SELECT (((SELECT cre-deb FROM pcsa WHERE mes=1 and ano=#1# and conta=temp1.conta)-(SELECT cre-deb FROM pcsa WHERE mes=12 and ano=(#1#-1) and conta=temp1.conta))/(SELECT cre-deb FROM pcsa WHERE mes=12 and ano=(#1#-1) and conta=temp1.conta))) as NUMERIC(10,2)) AS VARCHAR(6))+'%' , Saldo_Fev=(SELECT cre-deb FROM pcsa WHERE ano=#1# and mes=2 and conta=temp1.conta) , Desvio_Fev=CAST(CAST(100*(SELECT (((SELECT cre-deb FROM pcsa WHERE mes=2 and ano=#1# and conta=temp1.conta)-(SELECT cre-deb FROM pcsa WHERE mes=1 and ano=#1# and conta=temp1.conta))/(SELECT cre-deb FROM pcsa WHERE mes=1 and ano=#1# and conta=temp1.conta))) as NUMERIC(10,2)) AS VARCHAR(6))+'%' , Saldo_Mar=(SELECT cre-deb FROM pcsa WHERE ano=#1# and mes=3 and conta=temp1.conta) , Desvio_Mar=CAST(CAST(100*(SELECT (((SELECT cre-deb FROM pcsa WHERE mes=3 and ano=#1# and conta=temp1.conta)-(SELECT cre-deb FROM pcsa WHERE mes=2 and ano=#1# and conta=temp1.conta))/(SELECT cre-deb FROM pcsa WHERE mes=2 and ano=#1# and conta=temp1.conta))) as NUMERIC(10,2)) AS VARCHAR(6))+'%' , Saldo_Abr=(SELECT cre-deb FROM pcsa WHERE ano=#1# and mes=4 and conta=temp1.conta) , Desvio_Abr=CAST(CAST(100*(SELECT (((SELECT cre-deb FROM pcsa WHERE mes=4 and ano=#1# and conta=temp1.conta)-(SELECT cre-deb FROM pcsa WHERE mes=3 and ano=#1# and conta=temp1.conta))/(SELECT cre-deb FROM pcsa WHERE mes=3 and ano=#1# and conta=temp1.conta))) as NUMERIC(10,2)) AS VARCHAR(6))+'%' , Saldo_Mai=(SELECT cre-deb FROM pcsa WHERE ano=#1# and mes=5 and conta=temp1.conta) , Desvio_Mai=CAST(CAST(100*(SELECT (((SELECT cre-deb FROM pcsa WHERE mes=5 and ano=#1# and conta=temp1.conta)-(SELECT cre-deb FROM pcsa WHERE mes=4 and ano=#1# and conta=temp1.conta))/(SELECT cre-deb FROM pcsa WHERE mes=4 and ano=#1# and conta=temp1.conta))) as NUMERIC(10,2)) AS VARCHAR(6))+'%' , Saldo_Jun=(SELECT cre-deb FROM pcsa WHERE ano=#1# and mes=6 and conta=temp1.conta) , Desvio_Jun=CAST(CAST(100*(SELECT (((SELECT cre-deb FROM pcsa WHERE mes=6 and ano=#1# and conta=temp1.conta)-(SELECT cre-deb FROM pcsa WHERE mes=5 and ano=#1# and conta=temp1.conta))/(SELECT cre-deb FROM pcsa WHERE mes=5 and ano=#1# and conta=temp1.conta))) as NUMERIC(10,2)) AS VARCHAR(6))+'%' , Saldo_Jul=(SELECT cre-deb FROM pcsa WHERE ano=#1# and mes=7 and conta=temp1.conta) , Desvio_Jul=CAST(CAST(100*(SELECT (((SELECT cre-deb FROM pcsa WHERE mes=7 and ano=#1# and conta=temp1.conta)-(SELECT cre-deb FROM pcsa WHERE mes=6 and ano=#1# and conta=temp1.conta))/(SELECT cre-deb FROM pcsa WHERE mes=6 and ano=#1# and conta=temp1.conta))) as NUMERIC(10,2)) AS VARCHAR(6))+'%' , Saldo_Ago=(SELECT cre-deb FROM pcsa WHERE ano=#1# and mes=8 and conta=temp1.conta) , Desvio_Ago=CAST(CAST(100*(SELECT (((SELECT cre-deb FROM pcsa WHERE mes=8 and ano=#1# and conta=temp1.conta)-(SELECT cre-deb FROM pcsa WHERE mes=7 and ano=#1# and conta=temp1.conta))/(SELECT cre-deb FROM pcsa WHERE mes=7 and ano=#1# and conta=temp1.conta))) as NUMERIC(10,2)) AS VARCHAR(6))+'%' , Saldo_Set=(SELECT cre-deb FROM pcsa WHERE ano=#1# and mes=9 and conta=temp1.conta) , Desvio_Set=CAST(CAST(100*(SELECT (((SELECT cre-deb FROM pcsa WHERE mes=9 and ano=#1# and conta=temp1.conta)-(SELECT cre-deb FROM pcsa WHERE mes=8 and ano=#1# and conta=temp1.conta))/(SELECT cre-deb FROM pcsa WHERE mes=8 and ano=#1# and conta=temp1.conta))) as NUMERIC(10,2)) AS VARCHAR(6))+'%' , Saldo_Out=(SELECT cre-deb FROM pcsa WHERE ano=#1# and mes=10 and conta=temp1.conta) , Desvio_Out=CAST(CAST(100*(SELECT (((SELECT cre-deb FROM pcsa WHERE mes=10 and ano=#1# and conta=temp1.conta)-(SELECT cre-deb FROM pcsa WHERE mes=9 and ano=#1# and conta=temp1.conta))/(SELECT cre-deb FROM pcsa WHERE mes=9 and ano=#1# and conta=temp1.conta))) as NUMERIC(10,2)) AS VARCHAR(6))+'%' , Saldo_Nov=(SELECT cre-deb FROM pcsa WHERE ano=#1# and mes=11 and conta=temp1.conta) , Desvio_Nov=CAST(CAST(100*(SELECT (((SELECT cre-deb FROM pcsa WHERE mes=11 and ano=#1# and conta=temp1.conta)-(SELECT cre-deb FROM pcsa WHERE mes=10 and ano=#1# and conta=temp1.conta))/(SELECT cre-deb FROM pcsa WHERE mes=10 and ano=#1# and conta=temp1.conta))) as NUMERIC(10,2)) AS VARCHAR(6))+'%' , Saldo_Dez=(SELECT cre-deb FROM pcsa WHERE ano=#1# and mes=12 and conta=temp1.conta) , Desvio_Dez=CAST(CAST(100*(SELECT (((SELECT cre-deb FROM pcsa WHERE mes=12 and ano=#1# and conta=temp1.conta)-(SELECT cre-deb FROM pcsa WHERE mes=11 and ano=#1# and conta=temp1.conta))/(SELECT cre-deb FROM pcsa WHERE mes=11 and ano=#1# and conta=temp1.conta))) as NUMERIC(10,2)) AS VARCHAR(6))+'%' FROM (SELECT conta, cre, deb, mes, ano FROM pcsa WHERE ano=#1# AND mes between 1 and 12 and conta >= #2# and conta <=#3#) temp1 ORDER BY conta Aqui está o código que corre sempre que alguém necessita de analisar o dito balancete. Acredito que não seja o melhor código, como tal agradeço toda a ajuda para o tornar mais eficiente. Abraço e obrigado pela ajuda. Tesla Assinatura editada pelo staff, por favor consulte as regras. Link to comment Share on other sites More sharing options...
M6 Posted November 30, 2009 at 11:37 AM Report Share #298067 Posted November 30, 2009 at 11:37 AM Continuo a achar que a query é ineficiente e demasiado complexa e que com um group by por ano e mês se fazia isso em meia-dúzia de linhas... 10 REM Generation 48K! 20 INPUT "URL:", A$ 30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50 40 PRINT "404 Not Found" 50 PRINT "./M6 @ Portugal a Programar." Link to comment Share on other sites More sharing options...
Tesla Posted November 30, 2009 at 11:52 AM Author Report Share #298069 Posted November 30, 2009 at 11:52 AM A tabela que a query utiliza tem as seguintes colunas ano, mes, conta, cre, deb O desafio aqui foi conseguir colocar tudo numa forma tabular tendo os meses e os desvios por mês como colunas da tabela a apresentar. Eu só encontrei esta maneira de solucionar o problema, no entanto, tal como disse noutros posts, acredito piamente que o código escrito seja ineficiente. Como tal, e tendo já apresentado a estrutura da tabela e dito como deve ser feito o output da informação, gostaria imenso que me apresentassem uma melhor solução, até para poder optimizar os custos de processamento da organização onde trabalho. Abraço. Assinatura editada pelo staff, por favor consulte as regras. Link to comment Share on other sites More sharing options...
pc.cesar Posted December 26, 2009 at 11:42 AM Report Share #302445 Posted December 26, 2009 at 11:42 AM Boas, a base de dados que está a utilizar faz parte de um software que já tem um PAINEL DE BORDO onde aparecem esses dado no entanto, diga-me qual a versão do software e do sql, no IDU da analise pretendida tambem consegue colocar codigo sql para construir a analise envio uma das formas para o que pretende select ano, sum(case when mes='1' then (cre - deb) else 0 end)jan, sum(case when mes='2' then (cre - deb) else 0 end)fev, sum(case when mes='3' then (cre - deb) else 0 end)mar, sum(case when mes='4' then (cre - deb) else 0 end)abr, sum(case when mes='5' then (cre - deb) else 0 end)ami, sum(case when mes='6' then (cre - deb) else 0 end)jun, sum(case when mes='7' then (cre - deb) else 0 end)jun, sum(case when mes='8' then (cre - deb) else 0 end)ago, sum(case when mes='9' then (cre - deb) else 0 end)sete, sum(case when mes='10' then (cre - deb) else 0 end)out, sum(case when mes='11' then (cre - deb) else 0 end)nov, sum(case when mes='12' then (cre - deb) else 0 end)Dez from pcsa --where ano=2009 group by ano César Faria Link to comment Share on other sites More sharing options...
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