Pessoal,
Estou executando esse select:
SELECT
ped_data
, SUM(CASE WHEN ped_coddepto = 3 THEN 1 ELSE 0 END) AS fiscal
, SUM(CASE WHEN ped_coddepto = 5 THEN 1 ELSE 0 END) AS dsi
, SUM(CASE WHEN ped_coddepto = 7 THEN 1 ELSE 0 END) AS agendamento
, SUM(CASE WHEN ped_coddepto = 4 THEN 1 ELSE 0 END) AS logistica
, SUM(CASE WHEN ped_coddepto = 6 THEN 1 ELSE 0 END) AS transportadora
, COUNT(*) AS total
FROM pedido WHERE (ped_data < '2008-10-24')
GROUP BY ped_data
ORDER BY 1;
E obtenho esse resultado:
ped_data | fiscal | dsi | agendamento | logistica | transportadora |
total
-----------------+--------+-----+---------------------+------------+----------------------+-------
2008-10-20 | 1 | 0 | 1 | 0
| 0 | 2
2008-10-21 | 1 | 0 | 0 | 0
| 0 | 1
2008-10-22 | 2 | 0 | 2 | 0
| 0 | 4
2008-10-23 | 0 | 1 | 0 | 0
| 0 | 1
(4 registros)
Onde cada coluna (com exceção de ped_data e total) representa um
departamento, ou seja, o resultado me mostra o total por data e
departamento.
O problema é que isso está totalmente manual, se for criado um novo
departamento terei que alterar a select para contemplar o novo
departamento,
existe a possibilidade de deixar algo mais natural, sem necessidade de
alterar o select a cada novo departamento criado?
Colocar colunas dinamicamente sempre foi algo complicado no mundo
relacional.
Existem algumas formas de resolver isso, a mais clássica é não ter
colunas dinâmicas, ou seja, você faz seus totais em linhas, como abaixo,
montando as colunas na aplicação a partir do resultado:
SELECT
ped_data
ped_coddepto,
count(ped_coddepto) as somatoria
FROM pedido WHERE (ped_data < '2008-10-24')
GROUP BY ped_data, ped_coddepto
ORDER BY ped_data, ped_coddepto;
Eu colocaria uma tabela relacionada com os códigos e nomes de
departamento, aí com um simples inner join você pode obter os nomes.
A segunda opção é olhar a extensão tablefunc que faz a transposição de
linhas em colunas:
http://www.postgresql.org/docs/current/static/tablefunc.html
A terceira opçào é escrever uma função que te monte o SELECT de forma
dinâmica. Aviso antecipadamente que é a mais complicadinha de fazer
porque você obterá provavelmente um vetor de resultados pra facilitar o
retorno.
[]s
Flavio Gurgel
_______________________________________________
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral