Как вы возвращаете только одно поле, если для каждого поля есть несколько записей? - PullRequest
0 голосов
/ 01 мая 2018

Я пытаюсь вернуть только один адрес электронной почты для каждого сотрудника. Сотрудник может быть как работником, так и студентом. Если у вас есть адрес электронной почты как сотрудника, так и студента, то я хочу вернуть адрес электронной почты только сотрудника, если у вас есть только адрес электронной почты студента, то вернуть адрес электронной почты студента.

Вот весь запрос:

select --spriden_pidm                                                as pidm,
    spriden_id                                                 as ban_id,
    spriden_last_name                                          as lastname, 
    spriden_first_name                                         as firstname,
    gmal.email,
    phone_number.area || phone_number.phone                    as phone_number,
    addr.permanent_address                                          AS street,
    addr.permanent_city                                             AS city,
    addr.permanent_state                                            AS state,
    addr.permanent_zip                                              AS zip,

case
    when nbrjobs_ecls_code in ('E1', 'E2', 'EN', 'F1', 'F2') and nbrjobs_ann_salary between 0 and 49999.99 then 'EHRA1'
    when nbrjobs_ecls_code in ('E1', 'E2', 'EN', 'F1', 'F2') and nbrjobs_ann_salary between 50000 and 99999.99 then 'EHRA2'
    when nbrjobs_ecls_code in ('E1', 'E2', 'EN', 'F1', 'F2') and nbrjobs_ann_salary between 100000 and 149999.99 then 'EHRA3'
    when nbrjobs_ecls_code in ('E1', 'E2', 'EN', 'F1', 'F2') and nbrjobs_ann_salary >= 150000 then 'EHRA4'
    when nbrjobs_ecls_code in ('SE', 'SN', 'LE') and nbrjobs_ann_salary between 0 and 49999.99 then 'SHRA1'
    when nbrjobs_ecls_code in ('SE', 'SN', 'LE') and nbrjobs_ann_salary between 50000 and 99999.99 then 'SHRA2'
    when nbrjobs_ecls_code in ('SE', 'SN', 'LE') and nbrjobs_ann_salary between 100000 and 149999.99 then 'SHRA3'
    when nbrjobs_ecls_code in ('SE', 'SN', 'LE') and nbrjobs_ann_salary >= 150000 then 'SHRA4'
    when nbrjobs_ecls_code in ('FA') then 'AF'
    when nbrjobs_ecls_code in ('SH', 'SS', 'TS', 'WS') then 'M1'
else 
    null
end as empl_cat
from nbrjobs a,
     spriden,
     (select goremal_pidm as pidm,
                goremal_email_address as email
        from goremal
        where goremal_emal_code in ('EMPL', 'STDN')
         and goremal_status_ind = 'A') gmal,
     (SELECT sprtele_pidm       AS pidm,
           sprtele_phone_area   AS area,
           sprtele_phone_number AS phone
      FROM sprtele c
     WHERE     sprtele_tele_code = 'CA'
           AND sprtele_primary_ind = 'Y'
           AND sprtele_status_ind IS NULL
           AND sprtele_seqno =
                   (SELECT MAX (sprtele_seqno)
                      FROM sprtele
                     WHERE     sprtele_tele_code = 'CA'
                           AND sprtele_primary_ind = 'Y'
                           AND sprtele_status_ind IS NULL
                           AND sprtele_pidm = c.sprtele_pidm)) phone_number,
     --spraddr
     (SELECT spraddr_pidm         AS pidm,
           spraddr_street_line1 AS permanent_address,
           spraddr_city         AS permanent_city,
           spraddr_stat_code    AS permanent_state,
           spraddr_zip          AS permanent_zip
      FROM spraddr b
     WHERE     spraddr_atyp_code = 'CA'
           AND spraddr_status_ind IS NULL
           AND spraddr_seqno =
                   (SELECT MAX (spraddr_seqno)
                      FROM spraddr
                     WHERE     spraddr_atyp_code = 'CA'
                           AND spraddr_status_ind IS NULL
                           AND spraddr_pidm = b.spraddr_pidm)) addr
where a.nbrjobs_pidm = spriden_pidm
 and a.nbrjobs_pidm = gmal.pidm(+)
 and a.nbrjobs_pidm = phone_number.pidm(+)
 and a.nbrjobs_pidm = addr.pidm(+)
 and spriden_change_ind is null
 and a.nbrjobs_sgrp_code = to_char(sysdate, 'YYYY') 
 and a.nbrjobs_effective_date = (select max(b.nbrjobs_effective_date) 
                                    from nbrjobs b
                                    where b.nbrjobs_pidm = a.nbrjobs_pidm
                                     and b.nbrjobs_posn = a.nbrjobs_posn
                                     and b.nbrjobs_effective_date <= sysdate
                                     --and b.nbrjobs_ecls_code in ('E1','E2','EN','F1','F2','SE','SN','LE')
                                     and b.nbrjobs_ecls_code in ('E1','E2','EN','F1','F2','SE','SN','LE', 'RF', 'AF', 'FA', 'SH', 'SS', 'TS', 'WS')
                                     and b.nbrjobs_sgrp_code = to_char(sysdate, 'YYYY'))                                    
 and a.nbrjobs_status <> 'T';`

и это часть запроса, которую я пытаюсь изменить, чтобы вернуть желаемый адрес электронной почты

(select goremal_pidm as pidm,
                goremal_email_address as email
        from goremal
        where goremal_emal_code in ('EMPL', 'STDN')
         and goremal_status_ind = 'A') gmal,

Ответы [ 2 ]

0 голосов
/ 01 мая 2018

Итак, проблема в том, что запрос вернет два адреса электронной почты, если сотрудник также является студентом? В этом случае вы можете PIVOT данные, а затем использовать COALESCE(), чтобы получить адрес электронной почты студента, где адрес сотрудника равен NULL. Приведенный ниже запрос заменит проблемный подзапрос:

SELECT pidm, COALESCE(empl_email, stdn_email) AS email
  FROM (
    SELECT goremal_pidm AS pidm, goremal_email_address AS email, goremal_emal_code
      FROM goremal
     WHERE goremal_emal_code in ('EMPL', 'STDN')
       AND goremal_status_ind = 'A'
) PIVOT (
    MAX(email) FOR goremal_emal_code IN ('EMPL' AS empl_email, 'STDN' AS stdn_email)
)

РЕДАКТИРОВАТЬ: Кроме того, вы можете использовать условное агрегирование вместо явного PIVOT (полезно, если вы используете Oracle 9i или ниже):

SELECT pidm, COALESCE(empl_email, stdn_email) AS email FROM (
    SELECT goremal_pidm AS pidm
         , MAX(CASE WHEN goremal_emal_code = 'EMPL' THEN goremal_email_address END) AS empl_email
         , MAX(CASE WHEN goremal_emal_code = 'STDN' THEN goremal_email_address END) AS stdn_email
      FROM goremal
     WHERE goremal_emal_code in ('EMPL', 'STDN')
       AND goremal_status_ind = 'A'
     GROUP BY goremal_pidm
)

Надеюсь, это поможет.

0 голосов
/ 01 мая 2018

Попробуйте использовать NVL2, как пример для вашего случая -

NVL2 (EMP_EMAIL_ADR, EMP_EMAIL_ADR, STDN_EMAIL_ADR)

Этот пункт будет возвращаться, если адрес электронной почты Сотрудника не равен NULL, иначе он возвращает адрес электронной почты Студента.

Надеюсь, это поможет.

...