यहां बताया गया है कि आपको कई तिथियां कैसे मिल सकती हैं:
SELECT DATE'2015-01-01' + LEVEL - 1
FROM dual
CONNECT BY DATE'2015-01-01' + LEVEL - 1 < DATE'2015-02-01';
उपरोक्त सभी तिथियां 1 जनवरी, 2015 से 31 जनवरी, 2015 के बीच प्राप्त होंगी।
उपरोक्त का उपयोग करके आप क्या कर सकते हैं, अपनी शुरुआत और समाप्ति तिथियों में प्लग इन करें और सीटीई बनाएं, फिर तारीखों पर बाहरी जुड़ाव का उपयोग करें:
WITH dr AS (
SELECT DATE'2015-01-01' + LEVEL - 1 AS transaction_date
FROM dual
CONNECT BY DATE'2015-01-01' + LEVEL - 1 < DATE'2015-01-04'
)
SELECT V.VISIT_ID, dr.transaction_date
, P.NAME_LAST, ETT.ENC_TRANS_TYPE_NAME
...
ENCOUNTER_TRANSACTION ET RIGHT JOIN dr
ON ET.ENCOUNTER_TRANSACTION_DATE = dr.transaction_date
अपडेट करें मेरे पास कुछ समय था और मुझे लगता है कि मैं देखता हूं कि उपरोक्त को आपकी क्वेरी में कैसे एकीकृत किया जा सकता है। मेरे पास वास्तव में SQL Fiddle के लिए नमूना डेटा नहीं है (वैसे भी आपके पास इसके लिए बहुत सारी टेबल हैं)। यह वह जगह है जहां से आप शुरुआत कर सकते हैं, इसके लिए सभी उपयुक्त विज़िट और विज़िट की तारीखों की सीमा के साथ-साथ हर तारीख मिलनी चाहिए (यह मानते हुए कि कोई विज़िट 30 दिनों से अधिक नहीं है - तदनुसार इसे समायोजित करें):
WITH dr AS (
SELECT LEVEL AS dd FROM dual
CONNECT BY LEVEL <= 30 -- I'm assuming a max date range of 30; increase as you see fit
)
SELECT v.visit_id, v.start_date - 1 + dr.dd AS encounter_transaction_date
, p.name_last, ett.enc_trans_type_name
FROM visit v CROSS JOIN dr
WHERE v.start_date - 1 + dr.dd < TRUNC(v.end_date) + 1
AND v.institution_id = 1
AND v.end_date IS NOT NULL
AND v.voided_yn = 'N'
AND v.care_setting_code = 'I'
AND v.patient_team_id IN (16,17,18)
AND v.start_date >= TRUNC(ADD_MONTHS(CURRENT_DATE, -1), 'MONTH')
AND v.end_date < TRUNC(CURRENT_DATE, 'MONTH');
तब मुझे लगता है कि आपके बाहरी जोड़ वहां से बाएं शामिल होने चाहिए (कम से कम, अगर मैं सही ढंग से समझता हूं जो मैं नहीं कर सकता:
WITH dr AS (
SELECT LEVEL AS dd FROM dual
CONNECT BY LEVEL <= 30 -- I'm assuming a max date range of 30; increase as you see fit
)
SELECT v.visit_id, v.start_date - 1 + dr.dd AS encounter_transaction_date
FROM visit v CROSS JOIN dr
LEFT JOIN encounter_transaction et
ON v.visit_id = et.visit_id
AND v.institution_id = et.institution_id
AND TRUNC(v.start_date - 1 + dr.dd) = et.encounter_transaction_date
LEFT JOIN encounter_transaction_type ETT
ON et.encounter_type_id = ett.encounter_transaction_type_id
LEFT JOIN local_provider lp
ON et.ordering_provider_id = lp.local_provider_id
LEFT JOIN person_identifier i
ON i.identifier = lp.provider_number
AND i.identifier_sys_id = lp.provider_number_sys_id
AND i.identifier IN (
'1234', --Smith
'4321' --Jones ** you had an extra comma here!
)
LEFT JOIN person p
ON p.person_id = i.person_id
WHERE v.start_date - 1 + dr.dd < TRUNC(v.end_date) + 1
AND v.institution_id = 1
AND v.end_date IS NOT NULL
AND v.voided_yn = 'N'
AND v.care_setting_code = 'I'
AND v.patient_team_id IN (16,17,18)
AND v.start_date >= TRUNC(ADD_MONTHS(CURRENT_DATE, -1), 'MONTH')
AND v.start_date < TRUNC(CURRENT_DATE, 'MONTH');