Dúvida CASE WHEN

SQL Server

26/01/2021

Bom dia,

Preciso criar uma nova coluna com Case When do resultado de outra coluna CAse When, porém não estou conseguindo, estou começando a trabalhar com montagens de SQL server e não tenho muito conhecimento.

O resultado que preciso é deste Case:

case when round(sum(dsi.quantidade_total_atendida)/264,0) = 0 then round(i.media_venda_mes/22,0)
when round(i.media_venda_mes/22,0) = 0 then round(sum(dsi.quantidade_total_atendida)/264,0)
else round(sum(dsi.quantidade_total_atendida)/264,0)
end MÉDIA_UND_DIA
Anderson Pereira

Anderson Pereira

Curtidas 0

Melhor post

Emerson Nascimento

Emerson Nascimento

26/01/2021

dependendo da complexidade da instrução:
select
	[listadecampos,]
	case
		when tab.MÉDIA_UND_DIA condicao then 
	end
from
(
	select 
		[lista de campos,]
		case
			when round(sum(dsi.quantidade_total_atendida)/264,0) = 0 then round(i.media_venda_mes/22,0)
			when round(i.media_venda_mes/22,0) = 0 then round(sum(dsi.quantidade_total_atendida)/264,0)
			else round(sum(dsi.quantidade_total_atendida)/264,0)
		end MÉDIA_UND_DIA
	from
		[]
) tab


GOSTEI 1

Mais Respostas

Anderson Pereira

Anderson Pereira

26/01/2021

Obrigado, mas não consegui aplicar.
Abaixo o SQL completo como ele é no momento e funciona, só me falta esta última coluna que estou tentadno colocar diretamente nele, sem a necessidade de aplicar uma fórmula depois:

SELECT distinct

TO_CHAR(SUBSTR(i.CANAL,1,3)) ESTAÇÃO,
i.CANAL ENDEREÇO,
'' KNAPP,
i.CODIGO_DO_ITEM CÓDIGO,
i.DESCRICAO_DO_ITEM DESCRIÇÃO,
i.CODIGO_DA_SITUACAO_DO_ITEM SIT_ITEM,
CASE WHEN TO_CHAR(SUBSTR(i.TIPO_DO_ITEM,1,1)) = 1 THEN 'MEDICAMENTO'
ELSE 'PERFUMARIA'
END TIPO_ITEM,
i.QTD_PEDIDO_PENDENTE QNT_PEND,
PE.QUANTIDADE_ARMAZENADA ESTOQUE,
PE.QUANTIDADE_RESERVADA RESERVA,
i.CUSTO_MEDIO CUSTO_MÉDIO,
i.QUANTIDADE_NA_EMBALAGEM_PADRAO PADRÃO_COMPRAS,
CDI.QTDE_UNIDADES_EMBALAGEM_PADRAO PADRÃO_EMB,
round(COUNT(DSI.NUMERO_DOCUMENTO_SEPARADOR)/264,0) MÉDIA_ACESSOS,
case when round(sum(dsi.quantidade_total_atendida)/264,0) = 0 then round(i.media_venda_mes/22,0)
when round(i.media_venda_mes/22,0) = 0 then round(sum(dsi.quantidade_total_atendida)/264,0)
else round(sum(dsi.quantidade_total_atendida)/264,0)
end MÉDIA_UND_DIA

FROM PROCPR.ITENS_PARA_REDE_DE_MICROS i,
POSICOES_DE_ESTOQUE pe,
REC_ITENS_CDS CDI,
documentos_separadores ds,
documentos_separ_item dsi


WHERE (i.CODIGO_DA_FILIAL=1021)
AND PE.CODIGO_DA_ENTIDADE_COMERCIAL = I.CODIGO_DA_FILIAL
AND CDI.CODIGO_DA_FILIAL = PE.CODIGO_DA_ENTIDADE_COMERCIAL
AND DS.CODIGO_DA_ENT_COMERCIAL_MADI = I.CODIGO_DA_FILIAL
AND DSI.CODIGO_DA_FILIAL = DS.CODIGO_DA_ENT_COMERCIAL_MADI
AND DS.NUMERO_DOCUMENTO_SEPARADOR = DSI.NUMERO_DOCUMENTO_SEPARADOR
AND DSI.CODIGO_DO_ITEM = I.CODIGO_DO_ITEM
AND CDI.CODIGO_DO_ITEM = PE.CODIGO_DO_ITEM
AND PE.CODIGO_DO_ITEM = I.CODIGO_DO_ITEM
AND PE.CODIGO_DO_TIPO_DE_ESTOQUE = 1
AND DS.TIPO_DO_DOCUMENTO_SEPARADOR IN ('A','P','M')
AND DS.DIA_DE_DISTRIBUICAO_MADI >= trunc(sysdate-365)
AND (i.DATA_GERACAO>=trunc(sysdate-1))
AND I.CANAL NOT IN 'NULL'
AND i.estacao in ('ALI','PSI','M13','GLD','GLP','CNT','M12','M08','PTP','FR1','GVL','P2P','KMP','KM2')

GROUP BY

TO_CHAR(SUBSTR(i.CANAL,1,3)),
i.CANAL,
i.CODIGO_DO_ITEM,
i.DESCRICAO_DO_ITEM,
i.CODIGO_DA_SITUACAO_DO_ITEM,
CASE WHEN TO_CHAR(SUBSTR(i.TIPO_DO_ITEM,1,1)) = 1 THEN 'MEDICAMENTO'
ELSE 'PERFUMARIA'
END,
i.QTD_PEDIDO_PENDENTE,
PE.QUANTIDADE_ARMAZENADA,
PE.QUANTIDADE_RESERVADA,
i.CUSTO_MEDIO,
i.QUANTIDADE_NA_EMBALAGEM_PADRAO,
CDI.QTDE_UNIDADES_EMBALAGEM_PADRAO,
(i.media_venda_mes/22,0)
GOSTEI 0
Emerson Nascimento

Emerson Nascimento

26/01/2021

como você está usando GROUP BY, a cláusula DISTINCT é desnecessária.

tratando do problema exposto:
SELECT
	*,

	case	when MÉDIA_UND_DIA = x then 'blablabla'
			else 'blebleble'
	end TEXTO_MÉDIA_UND_DIA
FROM
(
SELECT
	TO_CHAR(SUBSTR(i.CANAL,1,3)) ESTAÇÃO,
	i.CANAL ENDEREÇO,
	'' KNAPP,
	i.CODIGO_DO_ITEM CÓDIGO,
	i.DESCRICAO_DO_ITEM DESCRIÇÃO,
	i.CODIGO_DA_SITUACAO_DO_ITEM SIT_ITEM,
	CASE	WHEN TO_CHAR(SUBSTR(i.TIPO_DO_ITEM,1,1)) = 1 THEN 'MEDICAMENTO'
			ELSE 'PERFUMARIA'
	END TIPO_ITEM,
	i.QTD_PEDIDO_PENDENTE QNT_PEND,
	PE.QUANTIDADE_ARMAZENADA ESTOQUE,
	PE.QUANTIDADE_RESERVADA RESERVA,
	i.CUSTO_MEDIO CUSTO_MÉDIO,
	i.QUANTIDADE_NA_EMBALAGEM_PADRAO PADRÃO_COMPRAS,
	CDI.QTDE_UNIDADES_EMBALAGEM_PADRAO PADRÃO_EMB,
	round(COUNT(DSI.NUMERO_DOCUMENTO_SEPARADOR)/264,0) MÉDIA_ACESSOS,
	case	when round(sum(dsi.quantidade_total_atendida)/264,0) = 0 then round(i.media_venda_mes/22,0)
			when round(i.media_venda_mes/22,0) = 0 then round(sum(dsi.quantidade_total_atendida)/264,0)
			else round(sum(dsi.quantidade_total_atendida)/264,0)
	end MÉDIA_UND_DIA
FROM
	PROCPR.ITENS_PARA_REDE_DE_MICROS i,
	POSICOES_DE_ESTOQUE pe,
	REC_ITENS_CDS CDI,
	documentos_separadores ds,
	documentos_separ_item dsi
WHERE
	(i.CODIGO_DA_FILIAL=1021)
	AND PE.CODIGO_DA_ENTIDADE_COMERCIAL = I.CODIGO_DA_FILIAL
	AND CDI.CODIGO_DA_FILIAL = PE.CODIGO_DA_ENTIDADE_COMERCIAL
	AND DS.CODIGO_DA_ENT_COMERCIAL_MADI = I.CODIGO_DA_FILIAL
	AND DSI.CODIGO_DA_FILIAL = DS.CODIGO_DA_ENT_COMERCIAL_MADI
	AND DS.NUMERO_DOCUMENTO_SEPARADOR = DSI.NUMERO_DOCUMENTO_SEPARADOR
	AND DSI.CODIGO_DO_ITEM = I.CODIGO_DO_ITEM
	AND CDI.CODIGO_DO_ITEM = PE.CODIGO_DO_ITEM
	AND PE.CODIGO_DO_ITEM = I.CODIGO_DO_ITEM
	AND PE.CODIGO_DO_TIPO_DE_ESTOQUE = 1
	AND DS.TIPO_DO_DOCUMENTO_SEPARADOR IN ('A','P','M')
	AND DS.DIA_DE_DISTRIBUICAO_MADI >= trunc(sysdate-365)
	AND (i.DATA_GERACAO>=trunc(sysdate-1))
	AND I.CANAL NOT IN 'NULL'
	AND i.estacao in ('ALI','PSI','M13','GLD','GLP','CNT','M12','M08','PTP','FR1','GVL','P2P','KMP','KM2')
GROUP BY
	TO_CHAR(SUBSTR(i.CANAL,1,3)),
	i.CANAL,
	i.CODIGO_DO_ITEM,
	i.DESCRICAO_DO_ITEM,
	i.CODIGO_DA_SITUACAO_DO_ITEM,
	CASE	WHEN TO_CHAR(SUBSTR(i.TIPO_DO_ITEM,1,1)) = 1 THEN 'MEDICAMENTO'
			ELSE 'PERFUMARIA'
	END,
	i.QTD_PEDIDO_PENDENTE,
	PE.QUANTIDADE_ARMAZENADA,
	PE.QUANTIDADE_RESERVADA,
	i.CUSTO_MEDIO,
	i.QUANTIDADE_NA_EMBALAGEM_PADRAO,
	CDI.QTDE_UNIDADES_EMBALAGEM_PADRAO,
	(i.media_venda_mes/22,0)
) TMP

GOSTEI 1
Anderson Pereira

Anderson Pereira

26/01/2021

Ficou perfeito agora.

A informação do distinct desconhecia que tendo o Group By não era necessário, muito obrigado por esta informação também.
GOSTEI 0
POSTAR