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

SQL Server

20/04/2017

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

Curtidas 0

Melhor post

Lucas Ramos

Lucas Ramos

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
GOSTEI 2

Mais Respostas

Cesar Azeredo

Cesar Azeredo

20/04/2017

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
GOSTEI 1
Wilson Marques

Wilson Marques

20/04/2017

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
GOSTEI 0
Luiz Santos

Luiz Santos

20/04/2017

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
GOSTEI 2
Wilson Marques

Wilson Marques

20/04/2017

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

abraços!
GOSTEI 0
POSTAR