Série da semana: Primeiros passos no Angular

Veja mais

Select utilizando Select CASE + INNER JOIN + GRoup BY

12/03/2019

13

Select utilizando Select CASE + INNER JOIN + GRoup BY

PRECISO AGRUPAR O RESULTADO POR CODIGOPRODUTO,
CODIGOCFOP E INSCRFEDERAL

está dando erro de função inválida , não contida na função agregada.


Select F.CODIGOPRODUTO PRODUTO ,
Y.DESCRPRODUTO descricao,
F.CODIGOCFOP cfop,
F.QUANTIDADE QUANT,
F.VALORTOTAL valor_produto,
B_B.NOMEPESSOA cliente,
B_B.INSCRFEDERAL INSCRicao,
case tipomedicamento
when 0 then ''''SIMILAR''''
WHEN 1 THEN ''''GENERICO''''
WHEN 2 THEN ''''REFERENCIA'''' END AS MEDICAMENTO ,
CASE CDANTITEM
WHEN ''''OUTROS'''' THEN ''''OUTROS'''' end as MEDICAMENTO_OUTROS ,
case CODIGOGRUPOPRODUTO
WHEN 9 THEN ''''LISTA NEGATIVA ''''
WHEN 10 THEN ''''NEUTRA ''''
WHEN 11 THEN ''''LISTA POSITIVA ''''
WHEN 14 THEN ''''BEBIDAS_ALCOOLICAS ''''
WHEN 15 THEN ''''AGUAS ''''
WHEN 16 THEN ''''OUTRAS_BEBIDAS ''''
WHEN 17 THEN ''''REFRIGERANTES ''''
WHEN 18 THEN ''''CERVEJAS ''''
WHEN 19 THEN ''''CHOPE ''''
WHEN 20 THEN ''''TABACO ''''
WHEN 21 THEN ''''CIMENTO ''''
WHEN 22 THEN ''''COMBUSTIVEIS_E_LUBRIFICANTES ''''
WHEN 23 THEN ''''ENERGIA_ELETRICA ''''
WHEN 24 THEN ''''FERRAMENTAS ''''
WHEN 25 THEN ''''LAMPADAS_REATORES_E_STARTER ''''
WHEN 26 THEN ''''MATERIAIS_DE_CONSTRUCAOO_E_CONGENERES ''''
WHEN 27 THEN ''''MATERIAIS_DE_LIMPEZA ''''
WHEN 28 THEN ''''MATERIAIS_ELETRICOS ''''
WHEN 29 THEN ''''PERFUMARIA ''''
WHEN 30 THEN ''''PAPEIS ''''
WHEN 31 THEN ''''PLASTICOS ''''
WHEN 32 THEN ''''PNEUMATICOS_CAMARAS_DE_AR_E_PROTETORES_DE_BORRACH ''''
WHEN 33 THEN ''''VAREJO ''''
WHEN 34 THEN ''''CARNES_PEIXES ''''
WHEN 35 THEN ''''HORTIFRUT ''''
WHEN 36 THEN ''''PRODUTOS_CERAMICOS ''''
WHEN 37 THEN ''''PERFUMARIA_HIGIENE_PESSOAL_COSMETICOS ''''
WHEN 38 THEN ''''ELETRONICOS_ELETROELETRONICOS_ELETRODOMESTICOS ''''
WHEN 39 THEN ''''RACOES ''''
WHEN 40 THEN ''''SORVETES ''''
WHEN 41 THEN ''''TINTAS_E_VERNIZES ''''
WHEN 42 THEN ''''VEICULOS_AUTOMOTORES ''''
WHEN 43 THEN ''''VIDROS ''''
WHEN 44 THEN ''''PAPELARIA ''''
when 13 then ''''AUTOPECAS '''' END AS SEGMENTACAO
from LCTOFISsaiPRODUTO F
left join Produto Y on (Y.CODIGOEMPRESA = F.CODIGOEMPRESA
and Y.CODIGOPRODUTO = F.CODIGOPRODUTO )
left join LCTOFISsai A on (A.CODIGOEMPRESA = F.CODIGOEMPRESA
and A.CHAVELCTOFISsai = F.CHAVELCTOFISsai and F.DATALCTOFIS=A.DATALCTOFIS)
left join Pessoa B_B on ( B_B.CODIGOPESSOA = A.CODIGOPESSOA)
where F.CODIGOEMPRESA = :Empresa and A.DATALCTOFIS BETWEEN :DATA_INICIAL AND :DATA_FINAL

group by F.codigoproduto , F. codigocfop, B_B.NOMEPESSOA , B_B.INSCRFEDERAL, Y.CDANTITEM
,Y.TIPOMEDICAMENTO, Y.CODIGOGRUPOPRODUTO
Responder

Post mais votado

13/03/2019

Quando você utiliza GROUP BY, você precisa utilizar funções de agregação nos campos apresentados e que não fazem parte do GROUP BY.
Na tua instrução você agrupa os campos
F.codigoproduto, F.codigocfop, B_B.NOMEPESSOA, B_B.INSCRFEDERAL,
Y.CDANTITEM, Y.TIPOMEDICAMENTO, Y.CODIGOGRUPOPRODUTO
porém seleciona outros campos e não os agrega.

Deveria ser algo assim:
Select
	F.CODIGOPRODUTO PRODUTO,
	MAX(Y.DESCRPRODUTO) descricao,
	F.CODIGOCFOP cfop,
	SUM(F.QUANTIDADE) QUANT,
	SUM(F.VALORTOTAL) valor_produto,
	B_B.NOMEPESSOA cliente,
	B_B.INSCRFEDERAL inscricao,
	case tipomedicamento
		WHEN 0 THEN 'SIMILAR' 
		WHEN 1 THEN 'GENERICO'
		WHEN 2 THEN 'REFERENCIA'
	end AS MEDICAMENTO,
	CDANTITEM as MEDICAMENTO_OUTROS,
	case CODIGOGRUPOPRODUTO 
		WHEN  9 THEN 'LISTA NEGATIVA'
		WHEN 10 THEN 'NEUTRA'
		WHEN 11 THEN 'LISTA POSITIVA'
		WHEN 14 THEN 'BEBIDAS_ALCOOLICAS'
		WHEN 15 THEN 'AGUAS'
		WHEN 16 THEN 'OUTRAS_BEBIDAS'
		WHEN 17 THEN 'REFRIGERANTES'
		WHEN 18 THEN 'CERVEJAS'
		WHEN 19 THEN 'CHOPE'
		WHEN 20 THEN 'TABACO'
		WHEN 21 THEN 'CIMENTO'
		WHEN 22 THEN 'COMBUSTIVEIS_E_LUBRIFICANTES'
		WHEN 23 THEN 'ENERGIA_ELETRICA'
		WHEN 24 THEN 'FERRAMENTAS'
		WHEN 25 THEN 'LAMPADAS_REATORES_E_STARTER'
		WHEN 26 THEN 'MATERIAIS_DE_CONSTRUCAOO_E_CONGENERES'
		WHEN 27 THEN 'MATERIAIS_DE_LIMPEZA'
		WHEN 28 THEN 'MATERIAIS_ELETRICOS'
		WHEN 29 THEN 'PERFUMARIA'
		WHEN 30 THEN 'PAPEIS'
		WHEN 31 THEN 'PLASTICOS'
		WHEN 32 THEN 'PNEUMATICOS_CAMARAS_DE_AR_E_PROTETORES_DE_BORRACH'
		WHEN 33 THEN 'VAREJO'
		WHEN 34 THEN 'CARNES_PEIXES'
		WHEN 35 THEN 'HORTIFRUT'
		WHEN 36 THEN 'PRODUTOS_CERAMICOS'
		WHEN 37 THEN 'PERFUMARIA_HIGIENE_PESSOAL_COSMETICOS'
		WHEN 38 THEN 'ELETRONICOS_ELETROELETRONICOS_ELETRODOMESTICOS'
		WHEN 39 THEN 'RACOES'
		WHEN 40 THEN 'SORVETES'
		WHEN 41 THEN 'TINTAS_E_VERNIZES'
		WHEN 42 THEN 'VEICULOS_AUTOMOTORES'
		WHEN 43 THEN 'VIDROS'
		WHEN 44 THEN 'PAPELARIA'
		WHEN 13 THEN 'AUTOPECAS'
	end AS SEGMENTACAO
from
	LCTOFISsaiPRODUTO F
left join
	Produto Y on
		Y.CODIGOEMPRESA = F.CODIGOEMPRESA
		and Y.CODIGOPRODUTO = F.CODIGOPRODUTO
left join
	LCTOFISsai A on
		A.CODIGOEMPRESA = F.CODIGOEMPRESA
		and A.CHAVELCTOFISsai = F.CHAVELCTOFISsai
		and F.DATALCTOFIS=A.DATALCTOFIS
left join
	Pessoa B_B on
		B_B.CODIGOPESSOA = A.CODIGOPESSOA
where
	F.CODIGOEMPRESA = :Empresa
	and A.DATALCTOFIS BETWEEN :DATA_INICIAL AND :DATA_FINAL
group by
	F.codigoproduto, F.codigocfop, B_B.NOMEPESSOA, B_B.INSCRFEDERAL,
	Y.CDANTITEM, Y.TIPOMEDICAMENTO, Y.CODIGOGRUPOPRODUTO

Note que os campos que NÃO estão no GROUP BY estão sendo agrupados pelas funções MAX() ou SUM().

Uma sugestão: no lugar daquele CASE gigante, crie uma tabela para obter a descrição do grupo do produto.
Responder

Mais Posts

13/03/2019

Ana Lichirgu

Bom dia! Acredito que a sintaxe do case esteja incorreta...
Você colocou assim:
CASE CDANTITEM
WHEN ''''OUTROS'''' THEN ''''OUTROS'''' end as MEDICAMENTO_OUTROS ,

O correto seria
CASE WHEN CDANTITEM = ''''OUTROS'''' THEN ''''OUTROS''''
end as MEDICAMENTO_OUTROS

Se tiver mais opções como no segundo case, você coloca WHEN CDANTITEM = ''''123'''' THEN ''''123'''' e finaliza com o end que você colocou...

Espero ter ajudado!
Responder

13/03/2019

Mayara Mattos

Bom dia,

Na verdade esse Case foi uma forma de buscar uma informação que não tem no sistema, ele está trazendo a informação certa.
Meu problema é que preciso fazer um group by por codigode produto, cfop e cliente.
Responder

13/03/2019

Mayara Mattos

Emerson Nascimento,

Deu certinho, muito Obrigada!

Sobre o Case o sistema é fechado, não me deixa criar tabelas nele :(

Me ajudou demais!
Responder