SQL: Converter linhas em Colunas
Já sentiu a necessidade de converter uma consulta SQL que retorna linhas para colunas?
No exemplo em questão… Tenho uma consulta que retorna valores e data, e quero trazer em colunas os meses de um periodo.
Na consulta abaixo, eu trago todas as informações em linhas
CLIENTE | DATA | VALOR |
1 | 31/01/2022 | 100.00 |
2 | 31/01/2022 | 70.00 |
3 | 31/01/2022 | 100.00 |
3 | 28/02/2022 | 70.00 |
2 | 28/02/2022 | 103.00 |
1 | 28/02/2022 | 70.32 |
1 | 31/03/2022 | 40.33 |
2 | 31/03/2022 | 100.00 |
Porém, preciso que me traga os valores correspondente aos meses e estes em colunas.
CLIENTE | JANEIRO | FEVEREIRO | MARÇO | ABRIL | MAIO | JUNHO | JULHO | AGOSTO | SETEMBRO | OUTUBRO | NOVEMBRO | DEZEMBRO |
1 | 194,00 | 404,00 | 885,00 | 933,00 | 373,00 | 210,00 | 957,00 | 996,00 | 155,00 | 10,00 | 353,00 | 704,00 |
2 | 741,00 | 145,00 | 829,00 | 150,00 | 831,00 | 284,00 | 350,00 | 63,00 | 389,00 | 469,00 | 746,00 | 860,00 |
3 | 273,00 | 76,00 | 199,00 | 172,00 | 447,00 | 15,00 | 663,00 | 145,00 | 331,00 | 730,00 | 691,00 | 777,00 |
Para este exemplo, eu tenho duas opções, usar o CASE ou usar o PIVOT do SQL.
Eu quero trazer o valor máximo (MAX), mas poderia está trazendo a média (AVG) como resultado.
Usando o CASE(), eu verifico o mês correspondente e retorno o valor.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
/*USANDO O CASE PARA TRANSFORMAR LINHAS EM COLUNAS*/ SELECT idcliente CLIENTE, COALESCE(MAX(CASE WHEN MONTH(periodo) = 1 THEN valor END), 0) [JANEIRO], COALESCE(MAX(CASE WHEN MONTH(periodo) = 2 THEN valor END), 0) [FEVEREIRO], COALESCE(MAX(CASE WHEN MONTH(periodo) = 3 THEN valor END), 0) [MARÇO], COALESCE(MAX(CASE WHEN MONTH(periodo) = 4 THEN valor END), 0) [ABRIL], COALESCE(MAX(CASE WHEN MONTH(periodo) = 5 THEN valor END), 0) [MAIO], COALESCE(MAX(CASE WHEN MONTH(periodo) = 6 THEN valor END), 0) [JUNHO], COALESCE(MAX(CASE WHEN MONTH(periodo) = 7 THEN valor END), 0) [JULHO], COALESCE(MAX(CASE WHEN MONTH(periodo) = 8 THEN valor END), 0) [AGOSTO], COALESCE(MAX(CASE WHEN MONTH(periodo) = 9 THEN valor END), 0) [SETEMBRO], COALESCE(MAX(CASE WHEN MONTH(periodo) = 10 THEN valor END), 0) [OUTUBRO], COALESCE(MAX(CASE WHEN MONTH(periodo) = 11 THEN valor END), 0) [NOVEMBRO], COALESCE(MAX(CASE WHEN MONTH(periodo) = 12 THEN valor END), 0) [DEZEMBRO] FROM METAANUAL WHERE YEAR(periodo) = 2022 GROUP BY idcliente |
Agora, usando o PIVOT()
O operador PIVOT no SQL Server, gera uma expressão com seus valores em tabela, ou seja, ele pega os dados que ficam em formato horizontal (linhas) e os coloca em formato vertical (Colunas).
1 2 3 4 5 6 7 8 9 10 11 12 13 |
/*USANDO O PIVOT PARA TRANSFORMAR LINHAS EM COLUNAS*/ SELECT idcliente CLIENTE, [JANUARY], [FEBRUARY], [MARCH], [APRIL], [MAY], [JUNE], [JULY], [AUGUST], [SEPTEMBER], [OCTOBER], [NOVEMBER], [DECEMBER] FROM ( SELECT idcliente, valor, FORMAT(periodo,'MMMM') PERIODO FROM METAANUAL WHERE YEAR(periodo) = 2022 ) AS TabelaOrigem PIVOT ( MAX(valor) FOR PERIODO IN ([JANUARY], [FEBRUARY], [MARCH], [APRIL], [MAY], [JUNE], [JULY], [AUGUST], [SEPTEMBER], [OCTOBER], [NOVEMBER], [DECEMBER]) ) AS LinhasParaColunas; |
Se você tiver outra maneira, compartilha com a gente!
Let’s Share!
Deixe uma resposta