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

## Recommended Posts

```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?

Abraço.

Assinatura editada pelo staff, por favor consulte as regras.

##### Share on other 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.

```10 REM Generation 48K!
20 INPUT "URL:", A\$
30 IF A\$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50
50 PRINT "./M6 @ Portugal a Programar."```

##### Share on other 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.

Assinatura editada pelo staff, por favor consulte as regras.

##### Share on other 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.

Tesla

Assinatura editada pelo staff, por favor consulte as regras.

##### Share on other 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...

```10 REM Generation 48K!
20 INPUT "URL:", A\$
30 IF A\$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50
50 PRINT "./M6 @ Portugal a Programar."```

##### Share on other 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.

Assinatura editada pelo staff, por favor consulte as regras.

##### Share on other 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

César Faria

## Create an account

Register a new account

×

• #### Revista PROGRAMAR

• Wiki
• IRC
×
• Create New...