Использование декодирования с 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 лет назад и все еще числится в девятом классе, будут портить ваши средние показатели.

Другие вопросы по тегам