1
resposta

[Dúvida] Como transformar linhas em colunas no PostgreSQL

Preciso gerar um relatório no Postgres, referente a produção diária dos empregados. Os dados gerados são: nome empregado, data da produção e a quantidade produzida nesta data. No entanto, preciso que a linha com a informação "data da produção", fique por coluna e não nas linhas. Pelo que vi o Crosstab faz isso, no entanto, entendi que é apenas para casos onde temos a previsão de quais dados estarão nesses colunas, como por exemplo, os meses do ano. No meu caso, como são dias, ou seja, não temos a previsão de qual será a data que é infinita possibilidades. Preciso de relatório com cabeçalho com informações dinâmicas!

exemplo:

Nome     data            Qtidade
João  -   01/10/2024 - 10
Maria -  01/10/2024 - 30
Pedro -  01/11/2024 - 20
Maria -  01/11/2024 - 10

Como preciso:

Nome     01/10/2024      01/11/2024
João            10                         0
Maria          30                        10
Pedro          0                          20
1 resposta

Olá Erica, tudo bem?

Para este caso, você pode tentar usar uma combinação de crosstab() com uma consulta dinâmica para criar as colunas com base nas datas. Isso é feito em uma consulta que utilize array_agg para gerar a lista de datas como colunas.

Abaixo eu deixo uma sugestão de código:

DO $$ 
DECLARE
    colunas text;
    query text;
BEGIN
    -- Gerar as datas dinamicamente
    SELECT string_agg(DISTINCT to_char(data, 'DD/MM/YYYY'), ', ') 
    INTO colunas
    FROM producao;

    -- Gerar a consulta dinâmica para o crosstab
    query := 'SELECT nome, ' || colunas || ' FROM crosstab(
                  $$SELECT nome, to_char(data, ''DD/MM/YYYY''), quantidade
                    FROM producao
                  ORDER BY 1, 2$$
              ) AS final(nome text, ' || replace(colunas, ',', ' integer,') || ' integer);';

    -- Executar a consulta gerada
    EXECUTE query;
END $$;

O código gera dinamicamente as colunas de data ao usar a função string_agg para criar uma lista das datas distintas da tabela. Em seguida, constrói a consulta do crosstab() com essas datas como colunas e, por fim, executa a consulta gerada para exibir o resultado final.

Reforço que os códigos acima são apenas sugestões e, como não tenho acesso ao seu projeto, pode ser necessário realizar ajustes para que se adequem às especificidades do seu ambiente.

Espero ter ajudado.

Qualquer dúvida, não hesite em compartilhar no fórum.

Abraços!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado