Fórum SELECT COM MAX #604296

06/08/2019

0

SQL

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!



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

Xerrors

Responder

Post mais votado

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

Emerson Nascimento

Emerson Nascimento
Responder

Gostei + 1

Mais Posts

06/08/2019

Jothaz

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
Responder

Gostei + 0

06/08/2019

Xerrors

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.

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
Responder

Gostei + 0

07/08/2019

Xerrors

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?


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!
Responder

Gostei + 0

07/08/2019

Emerson Nascimento

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
FROM

Responder

Gostei + 0

07/08/2019

Xerrors

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
FROM




Testei 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
Responder

Gostei + 0

07/08/2019

Emerson Nascimento

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_nascimento



Responder

Gostei + 0

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

Aceitar