Перечисление человека и его номер телефона - PullRequest
1 голос
/ 04 ноября 2019

Я использую PowerSchool (Oracle DB), и для того, чтобы сделать экспорт для нашей службы экстренных роботов, мне нужно получить отчет о студентах и ​​7 самых популярных телефонных номерах, связанных с ними. У меня есть запрос, который выводит только номера экстренных служб, но у меня возникают проблемы с переносом n-й телефонной записи в правильный контекст. Когда я запускаю текущий код, я получаю «ORA-00923: ключевое слово FROM не найдено там, где ожидается».

Я могу выбрать все значения из запроса в операторе WITH, и он выполняется так, как ожидалось. Тем не менее, я не знаю, как правильно получить их в основном запросе.

WITH emerglist as (
    select emergnumbers.stu_dcid, emergnumbers.contact_priority_order, 1 as phone_order, emergnumbers.contact_phone_1 as phone_number
    from emergnumbers where contact_phone_1 is not null
    UNION
    select emergnumbers.stu_dcid, emergnumbers.contact_priority_order, 2 as phone_order, emergnumbers.contact_phone_2 as phone_number
    from emergnumbers where contact_phone_2 is not null
    UNION
    select emergnumbers.stu_dcid, emergnumbers.contact_priority_order, 3 as phone_order, emergnumbers.contact_phone_3 as phone_number
    from emergnumbers where contact_phone_3 is not null
)
--select * from emerglist;  -- this works

select distinct 
    s.student_number as referencecode,
    s.first_name as firstname,
    s.last_name as lastname,
    --emergency numbers
    (select enum.phone_number from enum where rn=1) as emerg_1
    (select enum.phone_number from enum where rn=2) as emerg_2,
    (select enum.phone_number from enum where rn=3) as emerg_3,
    (select enum.phone_number from enum where rn=4) as emerg_4,
    (select enum.phone_number from enum where rn=5) as emerg_5,
    (select enum.phone_number from enum where rn=6) as emerg_6,
    (select enum.phone_number from enum where rn=7) as emerg_7
from students s
    left outer join (  select emerglist.*, rownum rn from emerglist order by contact_priority_order, phone_order  ) enum on s.dcid = enum.stu_dcid             
where s.enroll_status=0
;

Изменить, чтобы добавить: Моя цель - иметь по одной строке на каждого учащегося с таким количеством столбцов номеров экстренных служб, которые заполнены каквозможно, без пробелов (например, не может иметь emerg1 = #, emerg_2 = null, emerg_3 = #). Каждый студент может иметь 0-10 контактов, каждый контакт может иметь 0-5 номеров. Мы ограничены 7 номерами на одного студента. Это подмножество более крупного запроса, который также извлекает первичные числа для обычных сообщений, таких как снежные дни, адреса электронной почты и другие демографические данные. Все это работает, кроме номеров экстренных служб. Они используются только тогда, когда существует настоящая чрезвычайная ситуация, и мы хотим набрать максимально возможное количество цифр.

Пример данных из EmergList:

STU_DCID   CONTACT_PRIORITY_ORDER   PHONE_ORDER   PHONE_NUMBER
52  1   1   (222) 222-6476
52  2   1   (222) 555-9649
52  2   2   (222) 888-2212
58  1   1   (222) 222-1734
58  1   2   (222) 555-7222

Желаемые результаты:

REFERENCECODE   FIRSTNAME   LASTNAME   EMERG_1   EMERG_2   EMERG_3   EMERG_4   EMERG_5   EMERG_6   EMERG_7
52   John   Smith   (222) 222-6476   (222) 555-9649   (222) 888-2212
58   Mary   Jones   (222) 222-1734   (222) 555-7222

1 Ответ

0 голосов
/ 04 ноября 2019

Один из способов сделать это можно следующим образом ...

select STU_DCID, 
   MAX("1") "1", 
   MAX("2") "2",
   MAX("3") "3",
   MAX("4") "4", 
   MAX("5") "5",
   MAX("6") "6",
   MAX("7") "7", 
   MAX("8") "8",
   MAX("9") "9",
   MAX("10") "10"
from (
   select STU_DCID, 
          CONTACT_PRIORITY_ORDER, 
          PHONE_ORDER, 
          PHONE_NUMBER,
          ROW_NUMBER() OVER (PARTITION BY STU_DCID 
                             ORDER BY CONTACT_PRIORITY_ORDER, PHONE_ORDER) RN
   from EmergList) src
PIVOT (
MAX(PHONE_NUMBER)
FOR RN IN (1 "1", 2 "2", 3 "3",
           4 "4", 5 "5", 6 "6",
           7 "7", 8 "8", 9 "9",
           10 "10")
) GROUP BY STU_DCID;

Затем вы просто меняете псевдоним столбца и добавляете дополнительное объединение на src, чтобы получить имя студента ... текущий результат, который вы получите, это

STU_DCID    |       1       |       2        |      3         |4|5|6|7|8|9|10|
    52      |(222) 222-6476 | (222) 555-9649 | (222) 888-2212 | | | | | | | |
    58      |(222) 222-1734 | (222) 555-7222 |                | | | | | | | |
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...