Oracle sql, отображающий даты как пробелы

#sql #oracle #oracle11g

#sql #Oracle #oracle11g

Вопрос:

Я новичок в oracle sql, и это запрос, который я написал

     SELECT dt,
         CASE b.colorcode
            WHEN '#fff9c4' THEN 'COVID  ve'
            WHEN '#ffcdd2' THEN 'COVID Suspect'
            ELSE 'Normal'
         END
            "Ward Type",
         b.code "Ward CD",
         b.name "Ward Name",
         b.cnt "Total Patients",
         NVL (a.cnt, 0) "Total Updates Yesterday"
    FROM (  SELECT TRUNC (wih.whi_doctor_dt) dt,
                   NVL (wat.wat_curr_ward_cd, wat.wat_ward_cd) ward,
                   COUNT (*) cnt
              FROM tmh.w_ip_healthinfo wih,
                   tmh.a_doctor_master_base doc,
                   tmh.w_admission_txn wat
             WHERE     wih.whi_doctor_id = doc.adm_doctor_id
                   AND wih.whi_ip_num = wat.wat_ip_num
                   AND TRUNC (wih.whi_doctor_dt) = TRUNC (SYSDATE - 13) --between to_date('20200831000000','YYYYMMDDHH24MISS') and to_date('20200831235959','YYYYMMDDHH24MISS')
          GROUP BY TRUNC (wih.whi_doctor_dt),
                   NVL (wat.wat_curr_ward_cd, wat.wat_ward_cd)
          ORDER BY NVL (wat.wat_curr_ward_cd, wat.wat_ward_cd)) a
         RIGHT OUTER JOIN
         (  SELECT wardmst.wwm_ward_cd code,
                   wardmst.wwm_ward_desc name,
                   wardmst.wwm_wtype_wgrp_mapid,
                   wardmst.wwm_ward_sequence,
                   cvm1.cvm_value AS wardtype,
                   NVL (
                      (SELECT cvcolor.cvm_value
                         FROM tmh.t_objectmap ob
                              JOIN tmh.t_codevaluemaster CV
                                 ON ob.obm_containerid = CV.cvm_id
                              JOIN tmh.t_codevaluemaster cvcolor
                                 ON cvcolor.cvm_id = ob.obm_containeeid
                        WHERE     ob.obm_mappingtype = 350 --mapping of #color and ward / cabin
                              AND CV.cvm_value = wardmst.wwm_ward_cd
                              AND ob.obm_activeflag = 'Y'
                              AND ROWNUM = 1),
                      '#FFFFFF')
                      AS colorcode,
                   COUNT (*) cnt
              FROM tmh.w_bed_master_base bedmst
                   INNER JOIN tmh.w_ward_master_base wardmst
                      ON wardmst.wwm_ward_cd = bedmst.wbm_ward_cd
                   INNER JOIN tmh.t_objectmap om
                      ON om.obm_id = wardmst.wwm_wtype_wgrp_mapid
                   INNER JOIN tmh.t_codevaluemaster cvm
                      ON     cvm.cvm_id = om.obm_containerid
                         AND cvm.cvm_codetypeid = om.obm_containertype
                   INNER JOIN tmh.t_codevaluemaster cvm1
                      ON     cvm1.cvm_id = om.obm_containeeid
                         AND cvm1.cvm_codetypeid = om.obm_containeetype
                   INNER JOIN tmh.s_strmr_apprve appr
                      ON     appr.s_strmr_appid = bedmst.wbm_ward_cd
                         AND appr.s_strmr_typcd = 'WRD'
                         AND appr.s_strmr_enddt IS NULL
             WHERE     wardmst.wwm_active_flag = 'Y'
                   AND wardmst.wwm_wtype_wgrp_mapid <> 0
                   AND bedmst.wbm_bed_status = NVL ('O', bedmst.wbm_bed_status)
          /*and bedMst.WBM_BED_STATUS = NVL(:BedStatus, bedMst.WBM_BED_STATUS)
          and wardMst.WWM_WARD_CD = NVL(:WardCode, wardMst.WWM_WARD_CD)*/
          GROUP BY wardmst.wwm_ward_cd,
                   wardmst.wwm_ward_desc,
                   wardmst.wwm_wtype_wgrp_mapid,
                   wardmst.wwm_ward_sequence,
                   cvm1.cvm_value
          ORDER BY wardmst.wwm_wtype_wgrp_mapid, wardmst.wwm_ward_sequence) b
            ON b.code = a.ward
ORDER BY b.wwm_wtype_wgrp_mapid, b.wwm_ward_sequence
  

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

введите описание изображения здесь

Как вы можете видеть, там, где должны быть даты, есть пробелы. Каковы могут быть причины этих пробелов??

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

Комментарии:

1. Вероятно, потому whi_doctor_dt , что равно null . Я предполагаю, что если вы сделаете inner join вместо right outer join , вы не увидите, как эти записи появятся.

Ответ №1:

Правое внешнее соединение — это просто левое внешнее соединение, записанное наоборот. Мой совет — избегать их и записывать все внешние соединения как left join .

(Кроме того, inner outer ключевые слова and не являются строго обязательными. Некоторые люди считают, что они проясняют ситуацию, другие видят в них избыточный беспорядок. Я в лагере меньшего количества, но это зависит от вас.)

 select *
from   wxyz
       right join abcd on abcd.id = wxyz.id
  

может быть переписан более четко как

 select *
from   abcd
       right join wxyz on wxyz.id = abcd.id
  

Применение этого к вашему запросу дает:

 select a.dt
     , case b.colorcode
           when '#fff9c4' then 'COVID  ve'
           when '#ffcdd2' then 'COVID Suspect'
           else 'Normal'
        end "Ward Type"
      , b.code "Ward CD"
      , b.name "Ward Name"
      , b.cnt "Total Patients"
      , nvl(a.cnt, 0) "Total Updates Yesterday"
from    ( select wardmst.wwm_ward_cd code
               , wardmst.wwm_ward_desc name
               , wardmst.wwm_wtype_wgrp_mapid
               , wardmst.wwm_ward_sequence
               , cvm1.cvm_value as wardtype
               , nvl((select cvcolor.cvm_value
                      from   tmh.t_objectmap ob
                             join tmh.t_codevaluemaster cv on ob.obm_containerid = cv.cvm_id
                             join tmh.t_codevaluemaster cvcolor on cvcolor.cvm_id = ob.obm_containeeid
                      where  ob.obm_mappingtype = 350 --mapping of #color and ward / cabin
                      and    cv.cvm_value = wardmst.wwm_ward_cd
                      and    ob.obm_activeflag = 'Y'
                      and    rownum = 1), '#FFFFFF') as colorcode
               , count(*) cnt
          from   tmh.w_bed_master_base bedmst
                 join tmh.w_ward_master_base wardmst on wardmst.wwm_ward_cd = bedmst.wbm_ward_cd
                 join tmh.t_objectmap om on om.obm_id = wardmst.wwm_wtype_wgrp_mapid
                 join tmh.t_codevaluemaster cvm on cvm.cvm_id = om.obm_containerid and cvm.cvm_codetypeid = om.obm_containertype
                 join tmh.t_codevaluemaster cvm1 on cvm1.cvm_id = om.obm_containeeid and cvm1.cvm_codetypeid = om.obm_containeetype
                 join tmh.s_strmr_apprve appr on appr.s_strmr_appid = bedmst.wbm_ward_cd
          where  wardmst.wwm_active_flag = 'Y'
          and    wardmst.wwm_wtype_wgrp_mapid <> 0
          and    appr.s_strmr_typcd = 'WRD'
          and    appr.s_strmr_enddt is null
          and    bedmst.wbm_bed_status = nvl('O', bedmst.wbm_bed_status)
          group by
                 wardmst.wwm_ward_cd
               , wardmst.wwm_ward_desc
               , wardmst.wwm_wtype_wgrp_mapid
               , wardmst.wwm_ward_sequence
               , cvm1.cvm_value ) b
        left join
        ( select trunc(wih.whi_doctor_dt) dt
               , nvl(wat.wat_curr_ward_cd, wat.wat_ward_cd) ward
               , count(*) cnt
          from   tmh.w_ip_healthinfo wih
                 join tmh.a_doctor_master_base doc on doc.adm_doctor_id = wih.whi_doctor_id
                 join tmh.w_admission_txn wat on wat.wat_ip_num = wih.whi_ip_num
          where  trunc(wih.whi_doctor_dt) = trunc(sysdate - 13)
          group by trunc(wih.whi_doctor_dt), nvl(wat.wat_curr_ward_cd, wat.wat_ward_cd) ) a
       on a.ward = b.code
order by b.wwm_wtype_wgrp_mapid, b.wwm_ward_sequence
  

Я думаю, это проясняет, что b это драйвер и a набор с внешним соединением, что объясняет, почему a столбцы с префиксом могут быть нулевыми. (Возможно, вы также могли бы переключить метки a and b , чтобы пометить управляющий набор a .)

Кстати,

 nvl('O', bedmst.wbm_bed_status)
  

вероятно, должно быть

 nvl(bedmst.wbm_bed_status,'O')
  

Комментарии:

1. Привет, Уильям, спасибо за подробный ответ, но проблема все еще сохраняется. Я все еще получаю пробелы в поле даты

2. Когда- w_ip_healthinfo.whi_doctor_dt нибудь null? В противном случае в наборе должны быть коды b , в которых нет соответствующей ячейки в a наборе. Вы можете попробовать выполнить два запроса по отдельности, чтобы проверить, чего не хватает.

Ответ №2:

В запросе b у вас нет столбца dt. Вы соединяете запросы a и b с помощью right outer join. Таким образом, для тех записей из b, в которых нет совпадающей записи в столбце a — dt, равно null. Решения зависят от того, что вам нужно:

  1. добавьте столбец dt в запрос b, если у вас есть один или
  2. измените правое внешнее соединение на равнозначное соединение или оба