#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. Решения зависят от того, что вам нужно:
- добавьте столбец dt в запрос b, если у вас есть один или
- измените правое внешнее соединение на равнозначное соединение или оба