Sql Server - utilização da função group by com case
20/04/2017
0
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
Post mais votado
20/04/2017
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
Mais Posts
20/04/2017
Cesar Azeredo
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
20/04/2017
Wilson Marques
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
21/04/2017
Luiz Santos
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
25/04/2017
Wilson Marques
ficou muito mais simples e fácil para outros conseguirem entender.
abraços!
Clique aqui para fazer login e interagir na Comunidade :)