Agrupar resultado consulta SQL
Boa noite, fiz um select para me retornar quanto vendeu do produto x,y,z... nos meses que eu selecionar, porém eu preciso que cada mês fosse exibido em colunas. Utilizei o case pra fazer isso, extraindo o mês do campo timestamp que salva data hora da venda. Porém na exibição ele não esta agrupando os resultados. Já tentei fazer de tudo não consegui resolver.
Alguém tem alguma dica, ou uma outra forma de fazer?
Obrigado
Resultado do select
https://ibb.co/8xThMHb
Obs. Meu acesso a esse banco é somente leitura, não consigo fazer stored procedure.
Alguém tem alguma dica, ou uma outra forma de fazer?
Obrigado
select unid.nome , emba.etiqueta , emba.codigobarras , emba.descricao , case(extract(month from iven.datahora)) when '8' then count(iven.quantidade) end as Ago19 , case(extract(month from iven.datahora)) when '9' then count(iven.quantidade) end as Set19 from embalagem as emba left join itemvenda as iven on iven.embalagemid = emba.id inner join produto as prod on prod.id = emba.produtoid inner join classificacaoproduto as clap on clap.produtoid = prod.id inner join classificacao as clas on clas.id = clap.classificacaoid inner join unidadenegocio as unid on unid.id = iven.unidadenegocioid where iven.datahora between '01/08/2019 00:00:01' and '30/09/2019 23:59:59' and unid.codigo = '02' and clas.nome = 'GEN FARM POPULAR---' and iven.status = 'F' group by emba.etiqueta,unid.nome,emba.codigobarras,emba.descricao,iven.datahora order by emba.etiqueta
Resultado do select
https://ibb.co/8xThMHb
Obs. Meu acesso a esse banco é somente leitura, não consigo fazer stored procedure.
Paulo
Curtidas 0
Respostas
Emerson Nascimento
03/10/2019
você pode fazer assim:
ou usar pivot
https://www.postgresql.org/docs/9.1/tablefunc.html
select unid.nome , emba.etiqueta , emba.codigobarras , emba.descricao , sum(case extract(month from iven.datahora) when '8' then iven.quantidade else 0 end) as Ago19, , sum(case extract(month from iven.datahora) when '9' then iven.quantidade else 0 end) as Set19 from embalagem as emba left join itemvenda as iven on iven.embalagemid = emba.id inner join produto as prod on prod.id = emba.produtoid inner join classificacaoproduto as clap on clap.produtoid = prod.id inner join classificacao as clas on clas.id = clap.classificacaoid inner join unidadenegocio as unid on unid.id = iven.unidadenegocioid where iven.datahora between '01/08/2019 00:00:01' and '30/09/2019 23:59:59' and unid.codigo = '02' and clas.nome = 'GEN FARM POPULAR---' and iven.status = 'F' group by unid.nome,emba.etiqueta,emba.codigobarras,emba.descricao order by emba.etiqueta -- note que somente os campos não agregados do select estão listados no group by
ou usar pivot
https://www.postgresql.org/docs/9.1/tablefunc.html
GOSTEI 0
Paulo
03/10/2019
você pode fazer assim:
ou usar pivot
https://www.postgresql.org/docs/9.1/tablefunc.html
select unid.nome , emba.etiqueta , emba.codigobarras , emba.descricao , sum(case extract(month from iven.datahora) when '8' then iven.quantidade else 0 end) as Ago19, , sum(case extract(month from iven.datahora) when '9' then iven.quantidade else 0 end) as Set19 from embalagem as emba left join itemvenda as iven on iven.embalagemid = emba.id inner join produto as prod on prod.id = emba.produtoid inner join classificacaoproduto as clap on clap.produtoid = prod.id inner join classificacao as clas on clas.id = clap.classificacaoid inner join unidadenegocio as unid on unid.id = iven.unidadenegocioid where iven.datahora between '01/08/2019 00:00:01' and '30/09/2019 23:59:59' and unid.codigo = '02' and clas.nome = 'GEN FARM POPULAR---' and iven.status = 'F' group by unid.nome,emba.etiqueta,emba.codigobarras,emba.descricao order by emba.etiqueta -- note que somente os campos não agregados do select estão listados no group by
ou usar pivot
https://www.postgresql.org/docs/9.1/tablefunc.html
Não da certo dessa forma ele exige que todos os campos estejam dentro do group by. Não consegui usar o pivot do jeito que eu preciso.
Consegui resolver da maneira abaixo.
SELECT emba.etiqueta, emba.codigobarras, emba.descricao, clas.nome, CAST(COALESCE((SELECT SUM(iven.quantidade) FROM itemvenda AS iven WHERE iven.embalagemId = emba.id AND iven.datahora between '01/07/2019 00:00:01' AND '31/07/2019 23:59:59' AND iven.status = 'F' AND unidadenegocioid = 90658 GROUP BY iven.quantidade LIMIT 1), 0) AS INTEGER) AS Julho2019, CAST(COALESCE((SELECT SUM(iven.quantidade) FROM itemvenda AS iven WHERE iven.embalagemId = emba.id AND iven.datahora between '01/08/2019 00:00:01' AND '31/08/2019 23:59:59' AND iven.status = 'F' AND unidadenegocioid = 90658 GROUP BY iven.quantidade LIMIT 1), 0) AS INTEGER) AS Agosto2019, cast(COALESCE((SELECT SUM(iven.quantidade) FROM itemvenda AS iven WHERE iven.embalagemId = emba.id AND iven.datahora between '01/09/2019 00:00:01' AND '30/09/2019 23:59:59' AND iven.status = 'F' AND unidadenegocioid = 90658 GROUP BY iven.quantidade LIMIT 1), 0) AS INTEGER) AS Setembro2019 FROM embalagem AS emba inner join produto as prod on prod.id = emba.produtoid inner join classificacaoproduto as clap on clap.produtoid = prod.id inner join classificacao as clas on clas.id = clap.classificacaoid where clas.nome in ('GEN FARM POPULAR---','ETICO FARM POPULAR---') ORDER BY emba.etiqueta
GOSTEI 0