• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Tesla

Como colocar isto bonito... e não em forma de matriz identidade

7 mensagens neste tópico

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora