Использование декодирования с to_date
Если бы кто-нибудь мог помочь мне со следующим, я был бы благодарен: я пытаюсь написать код (создать предупреждение в PowerSchool), который будет указывать, является ли ученик моложе или старше среднего для их текущего уровня образования. (Например, поскольку ученик, родившийся до 30.06.2002, старше, чем в среднем для 9-го класса), я не могу заставить DECODE работать в сочетании с>= TO_DATE. Вот мое утверждение:
select lastfirst, decode (dob >= to_date ('2002-06-30', 'yyyy-mm-dd'), 'old') DOB
from students
where grade_level = 9
order by lastfirst
1 ответ
Вы, вероятно, могли бы сойти с рук с использованием декодирования PowerSchool в вашем sql, но я считаю, что код легче писать, когда в него включено меньше языков / систем, поэтому я бы не стал его использовать. Я также позволил бы SQL выполнять вычисление среднего возраста, чтобы вам не приходилось самим указывать или вычислять средние даты (объяснение строки TO_DATE см. В разделе " Усреднение дат в oracle sql").
SELECT
LastFirst AS "Student Name"
,CASE WHEN dob >= (
SELECT
TO_DATE(ROUND(AVG(TO_NUMBER(TO_CHAR(dob, 'J')))),'J')
FROM Students
WHERE Grade_Level = 9
AND Enroll_Status = 0
) THEN 'Younger' ELSE 'Older' END AS "Older or Younger?"
FROM Students
WHERE Grade_Level = 9
ORDER BY LastFirst
Подзапрос вычисляет средний день рождения, и оператор CASE сравнивает каждую из ваших записей с этим, сообщая, старше ли он или младше.
В подзапросе, который вычисляет среднее значение, я позволил себе предположить, что вы хотите сравнить только с зачисленными в данный момент учащимися, поскольку отозванные учащиеся сохраняют тот же самый уровень обучения. Вы действительно не хотите, чтобы те ученики, которые ушли 10 лет назад и все еще числится в девятом классе, будут портить ваши средние показатели.