Eu tenho uma tabela de mensagens em um banco de dados, que inclui um id de remetente e um tipo de mensagem (e, claro, muitas outras colunas não relevantes para esta questão). Eu tento criar uma consulta que conta quantas mensagens de cada tipo um usuário enviou.
por exemplo, se eu tiver a seguinte tabela:
---------------------- identificação | usuário_id | tipo de mensagem ---------------------- 1 | 1 | privado 2 | 1 | público 3 | 1 | privado ----------------------
Então eu quero obter o seguinte:
--------------------- identificação | privado | público --------------------- 1 | 2 | 1 ---------------------
Então, na verdade, quero agrupar por message_type e user_id, mas em vez de gerar várias linhas por usuário, quero criar várias colunas, uma para cada message_type
Posso conseguir isso sem codificar os tipos de mensagem em minha consulta?
Se você tiver um número limitado de valores que deseja converter em colunas, isso pode ser facilmente implementado usando uma função de agregação com uma
CASE
expressão:Consulte SQL Fiddle com demonstração
O PostgreSQL tem a capacidade de usar um
crosstab()
que pode ser usado instalando o módulo tablefunc . Isso executará uma transformação de dados semelhante de linhas em colunas. Criar uma versão dinâmica da consulta não é um processo direto, aqui está uma ótima solução para uma crosstab dinâmica no StackOverflow .O PostgreSQL não oferece suporte direto ao PIVOT, que é a palavra-chave geralmente usada em outras plataformas para algo assim. Ele tem algumas funções crosstab no módulo tablefunc .
Usando a função crosstab () , (uma excelente resposta StackOverflow)