On Wed, Sep 21, 2016 at 5:00 PM, Antonio Cesar <cgcesarsoa...@gmail.com> wrote:
> SELECT > tmp.codigo_empresa, > tmp.codigo_anterior, > tmp.tipo, > SUM(tmp.mes01) AS quantidade_mes01, > SUM(tmp.mes02) AS quantidade_mes02, > SUM(tmp.mes03) AS quantidade_mes03, > SUM(tmp.mes04) AS quantidade_mes04, > SUM(tmp.mes05) AS quantidade_mes05, > SUM(tmp.mes06) AS quantidade_mes06, > SUM(tmp.mes07) AS quantidade_mes07, > SUM(tmp.mes08) AS quantidade_mes08, > SUM(tmp.mes09) AS quantidade_mes09, > SUM(tmp.mes10) AS quantidade_mes10, > SUM(tmp.mes11) AS quantidade_mes11, > SUM(tmp.mes12) AS quantidade_mes12 > FROM > (SELECT > its.codigo_empresa, > ite.codigo_anterior, > CAST('Saídas' AS CHAR(15)) AS tipo, > SUM(CASE WHEN its.mes_ref = '102015' THEN (its.quantidade_saida / > un.quantidade) ELSE 0 END) AS mes01, > SUM(CASE WHEN its.mes_ref = '112015' THEN (its.quantidade_saida / > un.quantidade) ELSE 0 END) AS mes02, > SUM(CASE WHEN its.mes_ref = '122015' THEN (its.quantidade_saida / > un.quantidade) ELSE 0 END) AS mes03, > SUM(CASE WHEN its.mes_ref = '012016' THEN (its.quantidade_saida / > un.quantidade) ELSE 0 END) AS mes04, > SUM(CASE WHEN its.mes_ref = '022016' THEN (its.quantidade_saida / > un.quantidade) ELSE 0 END) AS mes05, > SUM(CASE WHEN its.mes_ref = '032016' THEN (its.quantidade_saida / > un.quantidade) ELSE 0 END) AS mes06, > SUM(CASE WHEN its.mes_ref = '042016' THEN (its.quantidade_saida / > un.quantidade) ELSE 0 END) AS mes07, > SUM(CASE WHEN its.mes_ref = '052016' THEN (its.quantidade_saida / > un.quantidade) ELSE 0 END) AS mes08, > SUM(CASE WHEN its.mes_ref = '062016' THEN (its.quantidade_saida / > un.quantidade) ELSE 0 END) AS mes09, > SUM(CASE WHEN its.mes_ref = '072016' THEN (its.quantidade_saida / > un.quantidade) ELSE 0 END) AS mes10, > SUM(CASE WHEN its.mes_ref = '082016' THEN (its.quantidade_saida / > un.quantidade) ELSE 0 END) AS mes11, > SUM(CASE WHEN its.mes_ref = '092016' THEN (its.quantidade_saida / > un.quantidade) ELSE 0 END) AS mes12 > FROM > ((item_mensal its > INNER JOIN item ite ON its.codigo_item = ite.codigo) > INNER JOIN unidade un ON ite.codigo_unidade = un.codigo) > WHERE > its.ano_ref >= '2015-10-01' AND > its.ano_ref <= '2016-09-30' AND > its.codigo_item = 10016528 > GROUP BY > "tipo", > its.codigo_empresa, > ite.codigo_anterior > UNION ALL > SELECT > its.codigo_empresa, > ite.codigo_anterior, > CAST('Entradas' AS CHAR(15)) AS tipo, > SUM(CASE WHEN its.mes_ref = '102015' THEN (its.quantidade_entrada > / un.quantidade) ELSE 0 END) AS mes01, > SUM(CASE WHEN its.mes_ref = '112015' THEN (its.quantidade_entrada > / un.quantidade) ELSE 0 END) AS mes02, > SUM(CASE WHEN its.mes_ref = '122015' THEN (its.quantidade_entrada > / un.quantidade) ELSE 0 END) AS mes03, > SUM(CASE WHEN its.mes_ref = '012016' THEN (its.quantidade_entrada > / un.quantidade) ELSE 0 END) AS mes04, > SUM(CASE WHEN its.mes_ref = '022016' THEN (its.quantidade_entrada > / un.quantidade) ELSE 0 END) AS mes05, > SUM(CASE WHEN its.mes_ref = '032016' THEN (its.quantidade_entrada > / un.quantidade) ELSE 0 END) AS mes06, > SUM(CASE WHEN its.mes_ref = '042016' THEN (its.quantidade_entrada > / un.quantidade) ELSE 0 END) AS mes07, > SUM(CASE WHEN its.mes_ref = '052016' THEN (its.quantidade_entrada > / un.quantidade) ELSE 0 END) AS mes08, > SUM(CASE WHEN its.mes_ref = '062016' THEN (its.quantidade_entrada > / un.quantidade) ELSE 0 END) AS mes09, > SUM(CASE WHEN its.mes_ref = '072016' THEN (its.quantidade_entrada > / un.quantidade) ELSE 0 END) AS mes10, > SUM(CASE WHEN its.mes_ref = '082016' THEN (its.quantidade_entrada > / un.quantidade) ELSE 0 END) AS mes11, > SUM(CASE WHEN its.mes_ref = '092016' THEN (its.quantidade_entrada > / un.quantidade) ELSE 0 END) AS mes12 > FROM > ((item_mensal its > INNER JOIN item ite ON its.codigo_item = ite.codigo) > INNER JOIN unidade un ON ite.codigo_unidade = un.codigo) > WHERE > its.ano_ref >= '2015-10-01' AND > its.ano_ref <= '2016-09-30' AND > its.codigo_item = 10016528 > GROUP BY > "tipo", > its.codigo_empresa, > ite.codigo_anterior) tmp > GROUP BY > tmp.tipo, > tmp.codigo_empresa, > tmp.codigo_anterior > ORDER BY > tmp.tipo, > tmp.codigo_empresa > Olhando a consulta, você faz um UNION ALL do que é a praticamente a mesma consulta, seria melhor se pudesse separar as colunas e ter o resultado da consulta como (codigo_empresa, codigo_anterior, mes01_entrada, mes01_saida, mes02_entrada, mes02_saida, etc.), é viável nesse formato? Se não for, pode ainda sim gerar dessa forma e usar um truquezinho com array e unnest para fazer o equivalente à um UNPIVOT: SELECT tmp.codigo_empresa, tmp.codigo_anterior, unnest(array['Entrada', 'Saida']) AS tipo, unnest(array[tmp.mes01_entrada, tmp.mes01_saida]) AS quantidade_mes01, unnest(array[tmp.mes02_entrada, tmp.mes02_saida]) AS quantidade_mes02, ... FROM ( SELECT its.codigo_empresa, ite.codigo_anterior, SUM(CASE WHEN its.mes_ref = '102015' THEN (its.quantidade_entrada / un.quantidade) ELSE 0 END) AS mes01_entrada, SUM(CASE WHEN its.mes_ref = '102015' THEN (its.quantidade_saida / un.quantidade) ELSE 0 END) AS mes01_saida, SUM(CASE WHEN its.mes_ref = '112015' THEN (its.quantidade_entrada / un.quantidade) ELSE 0 END) AS mes02_entrada, SUM(CASE WHEN its.mes_ref = '112015' THEN (its.quantidade_saida / un.quantidade) ELSE 0 END) AS mes02_saida, ... ) AS tmp Atenciosamente, -- Matheus de Oliveira
_______________________________________________ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral