On Wed, Sep 21, 2016 at 5:00 PM, Antonio Cesar <[email protected]>
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
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral