Sql Server - utilização da função group by com case

20/04/2017

0

Boa tarde pessoal,
sou novo por aqui!

espero que estejam todos bem!

tenho um problema e se alguém conseguisse me ajudar eu ficaria muito grato.

observem minha query abaixo, estou utilizando case como condição para uma coluna e no final quero agrupar somente pelos dois primeiros campos CODIGOREFERENCIA e NOME porém o SQL exige que utilizemos os outros dois campos que estão dentro do case.

como solucionar? pois não da para utilizar o apelido da nova coluna que contém o case no gropu By Ex.: 'SAIDA_ENTRADA'

Abraços e tenham um ótimo dia!



SELECT B.CODIGOREFERENCIA,
B.NOME,
SUM(A.QUANTIDADE),
CASE WHEN A.SALDOATUAL < A.SALDOANTERIOR THEN 'SAIDA' ELSE 'ENTRADA' END AS 'SAIDA_ENTRADA'
FROM PD_MOVIMENTACAOVARIACAO AS A
LEFT OUTER JOIN PD_PRODUTOS AS B ON (B.HANDLE = A.PRODUTO)
LEFT OUTER JOIN PD_ALMOXARIFADOS AS C ON (C.HANDLE = A.ALMOXARIFADOORIGEM)
LEFT OUTER JOIN PD_ALMOXARIFADOS AS D ON (D.HANDLE = A.ALMOXARIFADODESTINO)
LEFT OUTER JOIN GN_PESSOAS AS E ON (E.HANDLE = A.PESSOA)
LEFT OUTER JOIN Z_GRUPOUSUARIOS AS F ON (F.HANDLE = A.USUARIO)
LEFT OUTER JOIN GN_OPERACOES AS G ON (G.HANDLE = A.OPERACAO)
WHERE DATAHORAMOVIMENTACAO BETWEEN CONVERT(DATETIME, '01/01/2017 00:00:00', 103) AND CONVERT(DATETIME, '10/01/2017 05:00:00',
103)
AND B.GRUPO IS NOT NULL
GROUP BY B.CODIGOREFERENCIA,
B.NOME
Wilson Marques

Wilson Marques

Responder

Post mais votado

20/04/2017

Segue exemplo da Query

select x.CODIGOREFERENCIA, x.NOME, sum(x.quantidade) as QUANTIDADE, x.SAIDA_ENTRADA
from(

SELECT B.CODIGOREFERENCIA,
B.NOME,
A.QUANTIDADE,
CASE WHEN A.SALDOATUAL < A.SALDOANTERIOR THEN 'SAIDA' ELSE 'ENTRADA' END AS 'SAIDA_ENTRADA'
FROM PD_MOVIMENTACAOVARIACAO AS A
LEFT OUTER JOIN PD_PRODUTOS AS B ON (B.HANDLE = A.PRODUTO)
LEFT OUTER JOIN PD_ALMOXARIFADOS AS C ON (C.HANDLE = A.ALMOXARIFADOORIGEM)
LEFT OUTER JOIN PD_ALMOXARIFADOS AS D ON (D.HANDLE = A.ALMOXARIFADODESTINO)
LEFT OUTER JOIN GN_PESSOAS AS E ON (E.HANDLE = A.PESSOA)
LEFT OUTER JOIN Z_GRUPOUSUARIOS AS F ON (F.HANDLE = A.USUARIO)
LEFT OUTER JOIN GN_OPERACOES AS G ON (G.HANDLE = A.OPERACAO)
WHERE DATAHORAMOVIMENTACAO BETWEEN CONVERT(DATETIME, '01/01/2017 00:00:00', 103) AND CONVERT(DATETIME, '10/01/2017 05:00:00',
103)
AND B.GRUPO IS NOT NULL
) x

GROUP BY x.CODIGOREFERENCIA, x.NOME, x.SAIDA_ENTRADA

Lucas Ramos

Lucas Ramos
Responder

Mais Posts

20/04/2017

Cesar Azeredo

Tente

select CODIGOREFERENCIA,
NOME,
SUM(QUANTIDADE) as quantidade,
SAIDA_ENTRADA
from (
SELECT B.CODIGOREFERENCIA,
B.NOME,
SUM(A.QUANTIDADE) as quantidade,
CASE WHEN A.SALDOATUAL < A.SALDOANTERIOR THEN ''SAIDA'' ELSE ''ENTRADA'' END AS ''SAIDA_ENTRADA''
FROM PD_MOVIMENTACAOVARIACAO AS A
LEFT OUTER JOIN PD_PRODUTOS AS B ON (B.HANDLE = A.PRODUTO)
LEFT OUTER JOIN PD_ALMOXARIFADOS AS C ON (C.HANDLE = A.ALMOXARIFADOORIGEM)
LEFT OUTER JOIN PD_ALMOXARIFADOS AS D ON (D.HANDLE = A.ALMOXARIFADODESTINO)
LEFT OUTER JOIN GN_PESSOAS AS E ON (E.HANDLE = A.PESSOA)
LEFT OUTER JOIN Z_GRUPOUSUARIOS AS F ON (F.HANDLE = A.USUARIO)
LEFT OUTER JOIN GN_OPERACOES AS G ON (G.HANDLE = A.OPERACAO)
WHERE DATAHORAMOVIMENTACAO BETWEEN CONVERT(DATETIME, ''01/01/2017 00:00:00'', 103) AND CONVERT(DATETIME, ''10/01/2017 05:00:00'',
103)
AND B.GRUPO IS NOT NULL
GROUP BY B.CODIGOREFERENCIA,
B.NOME)
GROUP BY CODIGOREFERENCIA,
NOME ,SAIDA_ENTRADA
Responder

20/04/2017

Wilson Marques

Boa tarde amigo,
não deu certo.

mas quebrando a cabeça aqui tentei fazer o seguinte, colocar o mesmo case no group by mas sem o apelido "AS"
e ai deu certo!

segue abaixo como fiz caso mais alguém passe pelo mesmo "perrengue"

Abraços e muito obrigado!


SELECT B.CODIGOREFERENCIA,
B.NOME,
SUM(A.QUANTIDADE),
CASE WHEN A.SALDOATUAL < A.SALDOANTERIOR THEN ''SAIDA'' ELSE ''ENTRADA'' END AS ''SAIDA_ENTRADA''
FROM PD_MOVIMENTACAOVARIACAO AS A
LEFT OUTER JOIN PD_PRODUTOS AS B ON (B.HANDLE = A.PRODUTO)
LEFT OUTER JOIN PD_ALMOXARIFADOS AS C ON (C.HANDLE = A.ALMOXARIFADOORIGEM)
LEFT OUTER JOIN PD_ALMOXARIFADOS AS D ON (D.HANDLE = A.ALMOXARIFADODESTINO)
LEFT OUTER JOIN GN_PESSOAS AS E ON (E.HANDLE = A.PESSOA)
LEFT OUTER JOIN Z_GRUPOUSUARIOS AS F ON (F.HANDLE = A.USUARIO)
LEFT OUTER JOIN GN_OPERACOES AS G ON (G.HANDLE = A.OPERACAO)
WHERE DATAHORAMOVIMENTACAO BETWEEN CONVERT(DATETIME, ''01/01/2017 00:00:00'', 103) AND CONVERT(DATETIME, ''10/01/2017 05:00:00'',
103)
AND B.GRUPO IS NOT NULL
GROUP BY B.CODIGOREFERENCIA,
B.NOME,
CASE WHEN A.SALDOATUAL < A.SALDOANTERIOR THEN ''SAIDA'' ELSE ''ENTRADA'' END
Responder

21/04/2017

Luiz Santos

Wilson, que bom que conseguiu resolver.

Para ajudar o pessoal a entender melhor, criei esse exemplo (menor e mais simples que a sua query)


-- VERIFICA SE A TABELA EXISTE
IF OBJECT_ID('TEMPDB..#TESTE') IS NOT NULL
	DROP TABLE #TESTE

-- CRIA A TABELA
CREATE TABLE #TESTE(
	LETRA CHAR(1),
	VALOR INT
)

-- INSERE VALORES NA TABELA
INSERT INTO #TESTE (LETRA,VALOR)
VALUES ('A',1),
('B',2),
('C',3),
('D',4),
('E',5)


-- SELECT COM CASE E GROUP BY
SELECT CASE WHEN LETRA IN ('A','E','I','O','U') THEN 'VOGAL' 
       ELSE 'CONSOANTE' 
	   END AS GRUPO,
	   COUNT(1) AS QTD 
  FROM #TESTE
 GROUP BY CASE WHEN LETRA IN ('A','E','I','O','U') THEN 'VOGAL' 
          ELSE 'CONSOANTE' 
	      END



Grande abraço
Responder

25/04/2017

Wilson Marques

Muito bom Luiz Fernando!
ficou muito mais simples e fácil para outros conseguirem entender.

abraços!
Responder

Que tal ter acesso a um e-book gratuito que vai te ajudar muito nesse momento decisivo?

Ver ebook

Recomendado pra quem ainda não iniciou o estudos.

Eu quero
Ver ebook

Recomendado para quem está passando por dificuldades nessa etapa inicial

Eu quero

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar