Bom dia Pessoal,
Tenho uma consulta que me retorna a quantidade de um determinado
processo por grupo de material em 1 intervalo de 1 ano (dinamicamente).
O resultado desta consulta é o seguinte:
categoria | data_cotacao | total_cotacoes
-------------------------------+--------------+----------------
EMBALAGEM - FAZENDA | Feb | 1
EMBALAGEM - FAZENDA | Mar | 1
EXPEDIENTE - FAZENDA | Feb | 4
EXPEDIENTE - FAZENDA | Mar | 3
EXPEDIENTE - FAZENDA | Apr | 1
FARMACEUTICO - FAZENDA | Feb | 1
INFLAMAVEIS - FAZENDA | Aug | 1
INFLAMAVEIS - FAZENDA | Sep | 3
INFLAMAVEIS - FAZENDA | Jan | 4
INFLAMAVEIS - FAZENDA | Feb | 6
INFLAMAVEIS - FAZENDA | Mar | 5
INFLAMAVEIS - FAZENDA | Apr | 3
LIMPEZA - FAZENDA | Oct | 1
LIMPEZA - FAZENDA | Jan | 2
LIMPEZA - FAZENDA | Feb | 3
LIMPEZA - FAZENDA | Mar | 4
LIMPEZA - FAZENDA | Apr | 3
MANUTENCAO - FAZENDA | Sep | 3
MANUTENCAO - FAZENDA | Dec | 1
MANUTENCAO - FAZENDA | Jan | 42
MANUTENCAO - FAZENDA | Feb | 104
MANUTENCAO - FAZENDA | Mar | 180
MANUTENCAO - FAZENDA | Apr | 42
com isto, consigo com crosstab criar o relatório desejado:
SELECT *
FROM crosstab(
'WITH cotacoes AS(
SELECT DISTINCT ON(cot.id_cotacao,
catpai.nome)
date_trunc(''month'',cot.data)::date as data,
catpai.nome as categoria
FROM tb_cotacoes cot
JOIN tb_itens_cotacoes icot
ON icot.fk_cotacao = cot.id_cotacao
JOIN tb_produtos prod
ON prod.id_produto = icot.fk_produto
JOIN tb_categorias_produtos cat
ON cat.id_categoria = prod.fk_categoria
JOIN tb_categorias_produtos catpai
ON catpai.id_categoria = cat.fk_categoria_pai
WHERE cot.fk_cliente = IDCLIENTE
AND date_trunc(''month'',cot.data ) >=
date_trunc(''month'',current_date) - interval ''1 year''
)
SELECT categoria,
to_char(data,''Mon'') as data_cotacao,
count(categoria) as
total_cotacoes
FROM cotacoes
GROUP BY data,
categoria
ORDER BY categoria,
data',
'SELECT to_char(m,''Mon'') from
generate_series(date_trunc(''month'',current_date)::timestamp - interval
''11 months'',date_trunc(''month'',current_date)::timestamp,''1 month'') m'
) AS ( grupo text,
Mai int,
Jun int,
Jul int,
Ago int,
Set int,
Out int,
Nov int,
Dez int,
Jan int,
Fev int,
Mar int,
Abr int
);
Gerando o seguinte resultado:
grupo | Maio | Jun | Jul | Ago |
Set | Out | Nov | Dez | Jan | Fev | Mar | Abr
-------------------------------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------
EMBALAGEM - FAZENDA | (null) | (null) | (null) | (null)
| (null) | (null) | (null) | (null) | (null) | 1 | 1 | (null)
EXPEDIENTE - FAZENDA | (null) | (null) | (null) | (null)
| (null) | (null) | (null) | (null) | (null) | 4 | 3 | 1
FARMACEUTICO - FAZENDA | (null) | (null) | (null) | (null)
| (null) | (null) | (null) | (null) | (null) | 1 | (null) | (null)
INFLAMAVEIS - FAZENDA | (null) | (null) | (null) | 1
| 3 | (null) | (null) | (null) | 4 | 6 | 5 | 3
LIMPEZA - FAZENDA | (null) | (null) | (null) | (null)
| (null) | 1 | (null) | (null) | 2 | 3 | 4 | 3
MANUTENCAO - FAZENDA | (null) | (null) | (null) | (null)
| 3 | (null) | (null) | 1 | 42 | 104 | 180 | 42
MATERIAIS DE EMBALAGEM | (null) | (null) | (null) | (null)
| (null) | (null) | (null) | (null) | (null) | 1 | 1 | 1
MATERIAIS DE EMBALAGENS | 41 | 19 | 32 | 34
| 52 | 78 | 73 | 48 | 46 | 59 | 58 | 28
MATERIAIS DE EXPEDIENTE | 9 | 6 | 5 | 8
| 8 | 12 | 14 | 8 | 7 | 24 | 30 | 9
MATERIAIS DE LABORATORIO | 4 | 4 | 1 | 2
| 4 | 6 | 4 | 10 | 5 | 2 | 5 | 8
MATERIAIS DE LIMP.E CONSERV. | 13 | 10 | 11 | 15
| 19 | 18 | 19 | 18 | 17 | 35 | 36 | 10
Mas o crosstab não permite criar o nome destas colunas dinamicamente (a
consulta só retorna os últimos 12 meses). Assim, tenho que encapsular a
consulta em uma função e chamá-la em outras, uma para cada mês (e com
isso formatando o nome das colunas de maneira correta).
Existe alguma forma de fazer isto sem utilizar este artifício?
Agradeço a ajuda,
--
+--------------------------------------------------------------------------+
| Daniel Cordeiro de Morais Neto
| Diretor de TI - Portal de Cotações e-Compras
| Sócio-diretor ADM Soluções em Informática LTDA
| daniel.cordeiro(at)cotacoesecompras.com.br
| dmoraisn(at)gmail.com
| www.cotacoesecompras.com.br
| Fone: (083)8724-4440
| Gentoo User
| http://twitter.com/dmoraisn
+--------------------------------------------------------------------------+
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral