Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Besouro

subtrair e dividir no MySQL

Recommended Posts

Fala ai galera, tenho aqui uma query que pega o ultimo e o primeiro salario que o funcionario teve, e quantas vezes o salario dele foi alterado.

 

Tabela:

Employees: emp_no, first_name, last_name

Salaries: emp_no, salary, from_date, to_date

 

Agora preciso subtrair o ultimo salario pelo primeiro e dividir por esse numero de vezes q foi alterado. Alguem sabe como fazer isto?

 

 

SELECT e.emp_no employee_number, (

SELECT COUNT( * )

FROM salaries s

WHERE s.emp_no = e.emp_no ) n_of_changes, (

 

SELECT s.salary

FROM salaries s

WHERE s.emp_no = e.emp_no

ORDER BY s.from_date ASC

LIMIT 1) first_salary, (

 

SELECT s.salary

FROM salaries s

WHERE s.emp_no = e.emp_no

ORDER BY s.from_date DESC

LIMIT 1 ) last_salary

FROM employees e

 

 

 

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

Segue a forma matemática. Coloque a subtração entre parênteses e a divisão por fora:

SELECT (900 - 700) / 4;

Eu tentei isto, mas nao funcionou,

como ficaria na query:

 

SELECT e.emp_no, ((last_salary - first_salary) / n_of_changes ) average
FROM employees e, (

 

SELECT e.emp_no employee_number, (

SELECT COUNT( * )

FROM salaries s

WHERE s.emp_no = e.emp_no ) n_of_changes, (

SELECT s.salary

FROM salaries s

WHERE s.emp_no = e.emp_no

ORDER BY s.from_date ASC

LIMIT 1) first_salary, (

SELECT s.salary

FROM salaries s

WHERE s.emp_no = e.emp_no

ORDER BY s.from_date DESC

LIMIT 1 ) last_salary

FROM employees e

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não funcionou o que? Qual foi o retorno? Esta parte que te mandei funciona perfeitamente, se rodar exatamente o que passei no phpmyadmin, terá a resposta 50. O problema não está na forma que executa o calculo, e sim em algum outro lugar em alguma das querys. Recomendo ir montando parte a parte e ir testando. Esta é a melhor forma de encontrar erro em query.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Acho que ele só se confundiu um pouco na construção da SQL, veja se funciona, Besouro.

SELECT employee_number, ((last_salary - first_salary) / n_of_changes ) average
FROM (
 
SELECT e.emp_no employee_number, (
SELECT COUNT( * )
FROM salaries s
WHERE s.emp_no = e.emp_no ) n_of_changes, (
 
SELECT s.salary
FROM salaries s
WHERE s.emp_no = e.emp_no
ORDER BY s.from_date ASC
LIMIT 1) first_salary, (
 
SELECT s.salary
FROM salaries s
WHERE s.emp_no = e.emp_no
ORDER BY s.from_date DESC
LIMIT 1 ) last_salary
FROM employees e

) v

Compartilhar este post


Link para o post
Compartilhar em outros sites

Um último toque, Besouro, esta query é lenta, e fica cada vez pior a medida que o quadro de funcionários cresce (veja o link do problema do n+1), mas sempre existirá nosso amigo "SHOW PROCESSLIST" pra nos mostrar as queries lentas.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.