SELECT COM MAX
Bom dia, Estou tentando fazer um relatório porem não estou conseguindo trazer as informações corretamente.
No relatório precisa sair o maior salario de cada funcionário, porem o script esta pegando todos os salario de todos os funcionários, preciso apenas o maior de cada um.
1. Nesse select esta pegado o maior salario de todos os funcionários [vl_salario = (SELECT max(vl_salario) FROM FunSalario),]
2. nesse select esta trazendo todos os salários que o funcionário ja teve, preciso apenas do maior [FunSal.vl_salario AS SALBASE,]
OBS: filtrei por funcionário 65, para isolar o resultado e visualizar melhor. depois vai ser retirado.
como posso fazer o select com o max para pegar apenas o maior salario de cada funcionário?
obrigado!
Resultado errado -->
vl_salario SALBASE CODEMP CODFUNC NOMEFUNC DTNASC
---------------------- ---------------------- ------ ----------- ---------------------------------------- -----------------------
7000,00 1200 1 65 CEBOLINHA DA SILVA 1990-01-10 00:00:00.000
7000,00 1500 1 65 CEBOLINHA DA SILVA 1990-01-10 00:00:00.000
7000,00 1600,0 1 65 CEBOLINHA DA SILVA 1990-01-10 00:00:00.000
7000,00 1700,0 1 65 CEBOLINHA DA SILVA 1990-01-10 00:00:00.000
7000,00 1800,0 1 65 CEBOLINHA DA SILVA 1990-01-10 00:00:00.000
7000,00 2000,0 1 65 CEBOLINHA DA SILVA 1990-01-10 00:00:00.000
7000,00 2100,0 1 65 CEBOLINHA DA SILVA 1990-01-10 00:00:00.000
7000,00 2100,0 1 65 CEBOLINHA DA SILVA 1990-01-10 00:00:00.000
7000,00 2200,0 1 65 CEBOLINHA DA SILVA 1990-01-10 00:00:00.000
(9 linha(s) afetadas)
Resultado certo -->
vl_salario SALBASE CODEMP CODFUNC NOMEFUNC DTNASC
---------------------- ---------------------- ------ ----------- ---------------------------------------- -----------------------
2200,00 2200,00 1 65 CEBOLINHA DA SILVA 1990-01-10 00:00:00.000
(1 linha(s) afetadas)
obrigado;
No relatório precisa sair o maior salario de cada funcionário, porem o script esta pegando todos os salario de todos os funcionários, preciso apenas o maior de cada um.
1. Nesse select esta pegado o maior salario de todos os funcionários [vl_salario = (SELECT max(vl_salario) FROM FunSalario),]
2. nesse select esta trazendo todos os salários que o funcionário ja teve, preciso apenas do maior [FunSal.vl_salario AS SALBASE,]
OBS: filtrei por funcionário 65, para isolar o resultado e visualizar melhor. depois vai ser retirado.
como posso fazer o select com o max para pegar apenas o maior salario de cada funcionário?
obrigado!
select distinct vl_salario = (SELECT max(vl_salario) FROM FunSalario), FunSal.vl_salario AS SALBASE, fun.cd_empresa AS CODEMP, fun.cd_funcionario AS CODFUNC, fun.NOME AS NOMEFUNC, fun.dt_nascimento AS DTNASC from funcionario Fun FULL OUTER JOIN FunDocumento FunDoc ON (fUN.CD_FUNCIONARIO = FUNDOC.CD_FUNCIONARIO) FULL OUTER JOIN CRHFunDadosEstrangeiro FunEst ON (FUN.cd_funcionario = FunEst.cd_funcionario) FULL OUTER JOIN AlertaVencimento AlVenc ON (FUN.cd_funcionario = AlVenc.cd_funcionario) FULL OUTER JOIN FunFuncional FUNFUN ON (FUN.cd_funcionario = FUNFUN.cd_funcionario) FULL OUTER JOIN FunSalario FUNSAL ON (FUN.cd_funcionario = FUNSAL.cd_funcionario) FULL OUTER JOIN funcao funcao ON (FUNCAO.CD_FUNCAO = AlVenc.CD_FUNCAO ) FULL OUTER JOIN FunMovimentacao fUNMOV ON (FUN.cd_funcionario = FUNMOV.cd_funcionario) LEFT JOIN Rescisao RESC ON (FUN.cd_funcionario = Resc.cd_funcionario) WHERE FUNFUN.cd_empresa = 1 and RESC.dt_desligamento IS NULL AND FUN.cd_funcionario = 65
Resultado errado -->
vl_salario SALBASE CODEMP CODFUNC NOMEFUNC DTNASC
---------------------- ---------------------- ------ ----------- ---------------------------------------- -----------------------
7000,00 1200 1 65 CEBOLINHA DA SILVA 1990-01-10 00:00:00.000
7000,00 1500 1 65 CEBOLINHA DA SILVA 1990-01-10 00:00:00.000
7000,00 1600,0 1 65 CEBOLINHA DA SILVA 1990-01-10 00:00:00.000
7000,00 1700,0 1 65 CEBOLINHA DA SILVA 1990-01-10 00:00:00.000
7000,00 1800,0 1 65 CEBOLINHA DA SILVA 1990-01-10 00:00:00.000
7000,00 2000,0 1 65 CEBOLINHA DA SILVA 1990-01-10 00:00:00.000
7000,00 2100,0 1 65 CEBOLINHA DA SILVA 1990-01-10 00:00:00.000
7000,00 2100,0 1 65 CEBOLINHA DA SILVA 1990-01-10 00:00:00.000
7000,00 2200,0 1 65 CEBOLINHA DA SILVA 1990-01-10 00:00:00.000
(9 linha(s) afetadas)
Resultado certo -->
vl_salario SALBASE CODEMP CODFUNC NOMEFUNC DTNASC
---------------------- ---------------------- ------ ----------- ---------------------------------------- -----------------------
2200,00 2200,00 1 65 CEBOLINHA DA SILVA 1990-01-10 00:00:00.000
(1 linha(s) afetadas)
obrigado;
Xerrors
Curtidas 0
Melhor post
Emerson Nascimento
06/08/2019
deve ser algo assim:
SELECT fun.cd_empresa AS CODEMP, fun.cd_funcionario AS CODFUNC, fun.NOME AS NOMEFUNC, fun.dt_nascimento AS DTNASC, max(FUNSAL.vl_salario) AS vl_salario FROM funcionario Fun LEFT JOIN AlertaVencimento AlVenc ON (FUN.cd_funcionario = AlVenc.cd_funcionario) LEFT JOIN FunFuncional FUNFUN ON (FUN.cd_funcionario = FUNFUN.cd_funcionario) LEFT JOIN FunSalario FUNSAL ON (FUN.cd_funcionario = FUNSAL.cd_funcionario) LEFT JOIN Rescisao RESC ON (FUN.cd_funcionario = Resc.cd_funcionario) WHERE FUNFUN.cd_empresa = 1 and RESC.dt_desligamento IS NULL AND FUN.cd_funcionario = 65 GROUP BY fun.cd_empresa, fun.cd_funcionario, fun.NOME, fun.dt_nascimento
GOSTEI 1
Mais Respostas
Jothaz
06/08/2019
create table #temp (nome varchar(20), salario int)
insert into #temp values ('Voltaire', 100)
insert into #temp values ('Diderot', 100)
insert into #temp values ('d’Alembert', 100)
insert into #temp values ('Voltaire', 300)
insert into #temp values ('Montesquieu', 100)
insert into #temp values ('Rousseau', 100)
insert into #temp values ('d’Alembert', 50)
insert into #temp values ('Diderot', 80)
insert into #temp values ('Buffon', 100)
insert into #temp values ('d’Alembert', 110)
insert into #temp values ('Holdbach', 100)
insert into #temp values ('Voltaire', 200)
insert into #temp values ('Diderot', 800)
insert into #temp values ('Montesquieu', 300)
select nome, max(salario) from #temp group by nome order by nome
drop table #temp
GOSTEI 0
Xerrors
06/08/2019
Emerson, Ficou perfeito...
Pelo que notei.. os join tudo left e adicionou tudo como group.
Vou dar uma estudada mais a fundo nessas funções.
Obrigado.
Pelo que notei.. os join tudo left e adicionou tudo como group.
Vou dar uma estudada mais a fundo nessas funções.
Obrigado.
deve ser algo assim:
SELECT fun.cd_empresa AS CODEMP, fun.cd_funcionario AS CODFUNC, fun.NOME AS NOMEFUNC, fun.dt_nascimento AS DTNASC, max(FUNSAL.vl_salario) AS vl_salario FROM funcionario Fun LEFT JOIN AlertaVencimento AlVenc ON (FUN.cd_funcionario = AlVenc.cd_funcionario) LEFT JOIN FunFuncional FUNFUN ON (FUN.cd_funcionario = FUNFUN.cd_funcionario) LEFT JOIN FunSalario FUNSAL ON (FUN.cd_funcionario = FUNSAL.cd_funcionario) LEFT JOIN Rescisao RESC ON (FUN.cd_funcionario = Resc.cd_funcionario) WHERE FUNFUN.cd_empresa = 1 and RESC.dt_desligamento IS NULL AND FUN.cd_funcionario = 65 GROUP BY fun.cd_empresa, fun.cd_funcionario, fun.NOME, fun.dt_nascimento
GOSTEI 0
Xerrors
06/08/2019
outra duvida com MAX na nesse sequência desse codigo..
seu eu precisar fazer um filtro pegando a maior data da função desse funcionário.. eu colocaria na where?
CD_FUNCIONARIO DT_FUNCAO CD_FUNCAO descricao
-------------- ----------------------- --------- --------------------
65 2015-10-14 00:00:00.000 5 ESTUDANTE
65 2015-10-15 00:00:00.000 1 JOGADOR DE FUTEBOL
65 2015-10-16 00:00:00.000 9 PALHAÇO
65 2015-10-19 00:00:00.000 1 COMEDOR DE GOIABA
o resultado fique somente com a maior data.
3 2015-10-19 00:00:00.000 1 COMEDOR DE GOIABA
colocaria 'and MAX (FUNFUNCAO.DT_FUNCAO)' na where? ou teria que fazer um select dentro da where?
---> errro
Mensagem 4145, Nível 15, Estado 1, Linha 157
Uma expressão de tipo não booleano especificada em um contexto no qual se espera uma condição, próximo a 'AND'.
ou tentei colcoar tmeb assim -->
---> erro
Mensagem 4145, Nível 15, Estado 1, Linha 13
Uma expressão de tipo não booleano especificada em um contexto no qual se espera uma condição, próximo a 'group'.
obrigado!
seu eu precisar fazer um filtro pegando a maior data da função desse funcionário.. eu colocaria na where?
CD_FUNCIONARIO DT_FUNCAO CD_FUNCAO descricao
-------------- ----------------------- --------- --------------------
65 2015-10-14 00:00:00.000 5 ESTUDANTE
65 2015-10-15 00:00:00.000 1 JOGADOR DE FUTEBOL
65 2015-10-16 00:00:00.000 9 PALHAÇO
65 2015-10-19 00:00:00.000 1 COMEDOR DE GOIABA
o resultado fique somente com a maior data.
3 2015-10-19 00:00:00.000 1 COMEDOR DE GOIABA
colocaria 'and MAX (FUNFUNCAO.DT_FUNCAO)' na where? ou teria que fazer um select dentro da where?
WHERE FUN.CD_EMPRESA = 1 AND RESC.DT_DESLIGAMENTO IS NULL and MAX (FUNFUNCAO.DT_FUNCAO) AND FUN.CD_FUNCIONARIO = 65
---> errro
Mensagem 4145, Nível 15, Estado 1, Linha 157
Uma expressão de tipo não booleano especificada em um contexto no qual se espera uma condição, próximo a 'AND'.
ou tentei colcoar tmeb assim -->
WHERE FUN.CD_EMPRESA = 1 AND RESC.DT_DESLIGAMENTO IS NULL and (Select max(DT_FUNCAO) as data From funFUNCAO) AND FUN.CD_FUNCIONARIO = 65
---> erro
Mensagem 4145, Nível 15, Estado 1, Linha 13
Uma expressão de tipo não booleano especificada em um contexto no qual se espera uma condição, próximo a 'group'.
obrigado!
GOSTEI 0
Emerson Nascimento
06/08/2019
você quer apenas exibir a maior data? basta colocar MAX(FUNFUNCAO.DT_FUNCAO) na select.
SELECT
fun.cd_empresa AS CODEMP,
fun.cd_funcionario AS CODFUNC,
fun.NOME AS NOMEFUNC,
fun.dt_nascimento AS DTNASC,
max(FUNSAL.vl_salario) AS vl_salario,
max(FUNFUNCAO.DT_FUNCAO) data_funcao
FROMGOSTEI 0
Xerrors
06/08/2019
você quer apenas exibir a maior data? basta colocar MAX(FUNFUNCAO.DT_FUNCAO) na select.
SELECT
fun.cd_empresa AS CODEMP,
fun.cd_funcionario AS CODFUNC,
fun.NOME AS NOMEFUNC,
fun.dt_nascimento AS DTNASC,
max(FUNSAL.vl_salario) AS vl_salario,
max(FUNFUNCAO.DT_FUNCAO) data_funcao
FROMTestei de varias formas e o filtro nao acontece.. continua com o mesmo resultado.
você quer apenas exibir a maior data? na verdade não preciso exibir essa data, apenas preciso filtrar.. somente mostrar as informações da maior data.
Exemplo: tenho assim
CD_FUNCIONARIO DT_FUNCAO CD_FUNCAO descricao
-------------- ----------------------- --------- --------------------
65 2015-10-14 00:00:00.000 5 ESTUDANTE
65 2015-10-15 00:00:00.000 1 JOGADOR DE FUTEBOL
65 2015-10-16 00:00:00.000 9 PALHAÇO
65 2015-10-19 00:00:00.000 1 COMEDOR DE GOIABA
esta mostrando todas essas informações, porem preciso das informações da maior data...
65 2015-10-19 00:00:00.000 1 COMEDOR DE GOIABA
obrigado
GOSTEI 0
Emerson Nascimento
06/08/2019
ah... agora entendi... deve ser algo assim:
SELECT
fun.cd_empresa AS CODEMP,
fun.cd_funcionario AS CODFUNC,
fun.NOME AS NOMEFUNC,
fun.dt_nascimento AS DTNASC,
max(FUNSAL.vl_salario) AS vl_salario
FROM
funcionario Fun
LEFT JOIN
AlertaVencimento AlVenc ON (FUN.cd_funcionario = AlVenc.cd_funcionario)
LEFT JOIN
FunFuncional FUNFUN ON (FUN.cd_funcionario = FUNFUN.cd_funcionario)
LEFT JOIN
FunSalario FUNSAL ON (FUN.cd_funcionario = FUNSAL.cd_funcionario)
LEFT JOIN
FunFuncao ON (FunFuncao.CD_FUNCAO = AlVenc.CD_FUNCAO AND FunFuncao.cd_funcionario = FUN.cd_funcionario)
LEFT JOIN
Rescisao RESC ON (FUN.cd_funcionario = Resc.cd_funcionario)
WHERE
FUNFUN.cd_empresa = 1
and RESC.dt_desligamento IS NULL
AND FUN.cd_funcionario = 65
AND FunFuncao.DT_FUNCAO = (SELECT MAX(FN.DT_FUNCAO) FROM FunFuncao FN WHERE FN.cd_funcionario = FUN.cd_funcionario)
GROUP BY
fun.cd_empresa,
fun.cd_funcionario,
fun.NOME,
fun.dt_nascimentoGOSTEI 0