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

Responder a