Besouro 1 Denunciar post Postado Julho 12, 2016 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
allex_carvalho 124 Denunciar post Postado Julho 12, 2016 Segue a forma matemática. Coloque a subtração entre parênteses e a divisão por fora: SELECT (900 - 700) / 4; Compartilhar este post Link para o post Compartilhar em outros sites
allex_carvalho 124 Denunciar post Postado Julho 12, 2016 Segue a forma matemática. Coloque a subtração entre parênteses e a divisão por fora: SELECT (900 - 700) / 4; Compartilhar este post Link para o post Compartilhar em outros sites
lokaodomau 61 Denunciar post Postado Julho 12, 2016 Tome cuidado com estes SELECT dentro de SELECT. Conheça o problema do N+1 Compartilhar este post Link para o post Compartilhar em outros sites
Besouro 1 Denunciar post Postado Julho 12, 2016 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
allex_carvalho 124 Denunciar post Postado Julho 12, 2016 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
lokaodomau 61 Denunciar post Postado Julho 12, 2016 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
Besouro 1 Denunciar post Postado Julho 12, 2016 lokaodomau era isso mesmo, tinha montado errado. obrigado ! Compartilhar este post Link para o post Compartilhar em outros sites
lokaodomau 61 Denunciar post Postado Julho 12, 2016 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
Besouro 1 Denunciar post Postado Julho 12, 2016 é verdade, está muito lenta. O importante agora é que esta funcionando. Proximo passo é aprimora-la. Valeu ! Compartilhar este post Link para o post Compartilhar em outros sites
lokaodomau 61 Denunciar post Postado Julho 13, 2016 Marque como resolvido o tópico que mais lhe ajudou, caso tenha feito alguma alteração, poste o que fez, pra referências futuras. Compartilhar este post Link para o post Compartilhar em outros sites