Pesquisar este blog

Livros Recomendados

quinta-feira, 21 de outubro de 2021

URI (BEECROWD) - 2994 - Quanto Ganha um Médico? - SQL - PostgreSQL

Fala, pessoal! Tudo bem?

Hoje vou postar a solução do exercício 2994. Eu acabei de resolvê-lo.

Antes de resolver qualquer problema de SQL do URI (BEECROWD agora), recomendamos seguir os seguintes passos:

  1. Ler todo enunciado do problema.
  2. Ler os tópicos do fórum em caso de dúvidas
  3. Preparar o esquema, conforme fornecido no problema. Obs.: muitas vezes o pessoal coloca o código de criação do esquema no fórum, então é só copiar!

Plataforma: URI (BEECROWD)
Problema2994

Enunciado:

Você trabalha no setor de TI de um Hospital e precisa calcular a receita de pagamento de cada um dos médicos. Cada médico ganha 150$ por hora mais uma porcentagem dependendo do turno de trabalho, por exemplo, o médico Wellington trabalhou 1 hora no turno do dia, e 2 horas no turno da noite, logo seu salário semanal será: ( ( 1 * 150 ) + 1% ) + ( ( 2 * 150 ) + 15% ) = 496.5. Além disso, você pode usar a função round(value,1) para exibir os salários com 1 casa decimal e ordene o resultado do maior para o menor salário.

Solução:

Esse exercício eu não achei dos mais fáceis. É preciso usar o operador de agregação SUM e obter as horas trabalhadas multiplicadas por 150, mais o bônus da respectiva hora da tabela work_shifts. Ou seja, quem trabalhou 10 horas de dia a uma taxa de 10%, recebe 10 x 150 + 150 x 0,1. Se esta mesma pessoa trabalhou 5 horas de noite a uma taxa de 20%, recebe 5 x 150 + 150 x 0,2. E tudo isso precisa ser somado (as horas trabalhadas em todos os turnos).

A fórmula que utilizei no SQL pode parecer um pouco complicada e diferente do que expliquei acima, mas vamos lá, por partes:

  • attendances.hours * 150 representa o quanto ele ganha por hora.
  • (attendances.hours * 15)*work_shifts.bonus)*.1 representa o bônus
No caso do bônus eu apenas simplifiquei, já que a hora vale 150 e precisaríamos dividir tudo por 100  (ou multiplicar por 0,01). Cortei dois zeros dessa operação e fiquei com a hora valendo 15 e a multiplicação de 0,01 passou a ser de 0,1. Eu utilizei .1 e não 0.1 apenas para simplificar e me poupar de escrever um dígito, mas é a mesma coisa.

As demais cláusulas apenas garantem as referências corretas e a ordenação solicitada, bem como a nomeação da coluna para salary, utilizada na ordenação do resultado de forma descendente (DESC).

Acredito que dava pra fazer um pouco diferente. Como você fez?

O código que submeti na plataforma ficou assim:

SELECT
	doctors.name,
	ROUND(SUM((attendances.hours * 150)+((attendances.hours * 15)*work_shifts.bonus)*.1), 1) AS salary
FROM doctors, attendances, work_shifts
WHERE
	doctors.id=attendances.id_doctor
    AND work_shifts.id=attendances.id_work_shift
GROUP BY doctors.name
ORDER BY salary DESC;

Ignore a cor azul da palavra "name", pois ela não é uma palavra reservada aqui, mas uma coluna da tabela doctors. Bom, não esqueça também de quebrar o código em várias linhas se ele ficar muito grande! Esse código mesmo, a linha três eu não quebrei só para não afetar a fórmula, mas acho que ficou grande de qualquer maneira!

Por hoje é isso!

Nenhum comentário:

Postar um comentário

Postagem em destaque

URI (BEECROWD) - 2158 - Helping Uncle Cláudio (Ajudando o Tio Cláudio) - Matemática - C, C++ e Haskell

Buenas! Estou aqui mais uma vez para resolver um problema de Matemática! Agora tenho resolvido alguns dessa categoria, pra que vocês possam ...

Postagens mais visitadas