Ir para o conteúdo
• Revista PROGRAMAR: Já está disponível a edição #57 da revista programar. Faz já o download aqui!

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

Tesla    0

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

#### Partilhar esta mensagem

##### Partilhar noutros sites
M6    71

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.

#### Partilhar esta mensagem

##### Partilhar noutros sites
Tesla    0

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.

#### Partilhar esta mensagem

##### Partilhar noutros sites
Tesla    0

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

#### Partilhar esta mensagem

##### Partilhar noutros sites
M6    71

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

#### Partilhar esta mensagem

##### Partilhar noutros sites
Tesla    0

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.

#### Partilhar esta mensagem

##### Partilhar noutros sites
pc.cesar    3

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

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

×