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

Responder a