Agrupar resultado consulta SQL

PostgreSQL

03/10/2019

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

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

Paulo

Curtidas 0

Respostas

Emerson Nascimento

Emerson Nascimento

03/10/2019

você pode fazer assim:
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

Paulo

03/10/2019

você pode fazer assim:
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
POSTAR