Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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
Segue a forma matemática. Coloque a subtração entre parênteses e a divisão por fora:
SELECT (900 - 700) / 4;
Tome cuidado com estes SELECT dentro de SELECT.
>
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
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.
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
lokaodomau
era isso mesmo, tinha montado errado.
obrigado !
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.
é verdade, está muito lenta.
O importante agora é que esta funcionando.
Proximo passo é aprimora-la.
Valeu !
Marque como resolvido o tópico que mais lhe ajudou, caso tenha feito alguma alteração, poste o que fez, pra referências futuras.
Segue a forma matemática. Coloque a subtração entre parênteses e a divisão por fora:
SELECT (900 - 700) / 4;