मैं मौजूदा दृश्य डेटा से एक दृश्य बनाने की कोशिश कर रहा हूं, लेकिन अगर कुछ लाइनें हैं जो प्रति भाग/तारीख कॉम्बो मौजूद नहीं हैं, तो उन पंक्तियों को बनाया जाए। मेरे पास नीचे दी गई क्वेरी है जो दिखा रही है कि मेरे पास वर्तमान में विशेष s_date/part_no कॉम्बो के लिए क्या है:

SELECT
    s_date,
    part_no,
    issue_group,
    s_level,
    qty_filled
FROM
    current_view
WHERE
    part_no = 'xxxxx'
    AND s_date IN (
        '201802',
        '201803'
    )
ORDER BY
    s_date,
    part_no,
    issue_group,
    DECODE(s_level, '80', 1, '100', 2, 'Late', 3)

जो नीचे का उत्पादन करता है:

enter image description here

मुझे पता है कि उस डेटा के साथ एक दृश्य कैसे बनाया जाता है, यह आसान हिस्सा है। लेकिन मुझे जो चाहिए वह प्रत्येक issue_group and s_level कॉम्बो के लिए एक पंक्ति है, और यदि यह एक बनाई गई रेखा है, तो 0 को qty_filled के रूप में रखने के लिए।

प्रत्येक part_no / s_date कॉम्बो में 6 पंक्तियाँ होनी चाहिए जो इसके साथ चलती हैं

 - issue_group = '1' / s_level = '80'
 - issue_group = '1' / s_level = '100'
 - issue_group = '1' / s_level = 'Late'
 - issue_group = '2/3 ' / s_level = '80'
 - issue_group = '2/3 ' / s_level = '100'
 - issue_group = '2/3 ' / s_level = 'Late'

इसलिए यदि उपरोक्त संयोजनों में से एक वर्तमान s_date/part_no के लिए पहले से मौजूद है, तो यह स्पष्ट रूप से वर्तमान दृश्य से qty_filled जानकारी लेता है। यदि नहीं, तो एक नई लाइन बनाई जाती है, और qty_filled = 0। तो मैं इसे इस तरह दिखने की कोशिश कर रहा हूं:

enter image description here

मैंने केवल 1 भाग दिखाया है, कुछ तिथियों के साथ, बस बिंदु को पार करने के लिए। तालिका के भीतर 10k+ भाग हैं और 6 अंक_ग्रुप/एस_लेवल कॉम्बो में से प्रत्येक के लिए 1 से अधिक भाग/दिनांक कॉम्बो कभी नहीं होंगे।

2
KassieB 16 जिंदा 2019, 01:22

2 जवाब

सबसे बढ़िया उत्तर

विचार CROSS JOIN का उपयोग करके पंक्तियों को उत्पन्न करना है और फिर LEFT JOIN के साथ अतिरिक्त जानकारी लाना है। Oracle सिंटैक्स में, ऐसा दिखता है:

WITH v as (
      SELECT v.*
      FROM current_view v
      WHERE part_no = 'xxxxx' AND
            s_date IN ('201802', '201803')
    )
SELECT d.s_date, ig.part_no, ig.issue_group, l.s_level,
       COALESCE(v.qty_filled, 0) as qty_filled
FROM (SELECT DISTINCT s_date FROM v) d CROSS JOIN
     (SELECT DISTINCT part_no, ISSUE_GROUP FROM v) ig CROSS JOIN
     (SELECT '80' as s_level FROM DUAL UNION ALL
      SELECT '100' FROM DUAL UNION ALL
      SELECT 'LATE' FROM DUAL
     ) l LEFT JOIN
     v
     ON v.s_date = d.s_date AND v.part_no = ig.part_no AND
        v.issue_group = ig.issue_group AND v.s_level = l.s_level
ORDER BY s_date, part_no, issue_group,
         (CASE s_level WHEN  '80' THEN 1 WHEN '100' THEN 2 WHEN 'Late' THEN 3 END)
0
Gordon Linoff 16 जिंदा 2019, 02:08

एक समाधान यह हो सकता है कि मूल्यों की (निश्चित) सूची के बीच कार्टेशियन उत्पाद का उपयोग करके सभी अपेक्षित पंक्तियों का कार्टेशियन उत्पाद उत्पन्न किया जाए, और फिर LEFT JOIN इसे current_view के साथ।

निम्नलिखित क्वेरी गारंटी देती है कि आपको प्रत्येक दिए गए s_date/part_no/issue_group/s_level टपल के लिए एक रिकॉर्ड मिलेगा। यदि current_view में कोई रिकॉर्ड मेल नहीं खाता है, तो क्वेरी एक 0 मात्रा प्रदर्शित करेगी।

SELECT
    sd.s_date,
    pn.part_no,
    ig.issue_group,
    sl.s_level,
    COALESCE(cv.qty_filled, 0) qty_filled
FROM
    (SELECT '201802' AS s_date UNION SELECT '201803') AS sd
    CROSS JOIN (SELECT 'xxxxx' AS part_no) AS pn
    CROSS JOIN (SELECT '1' AS issue_group UNION SELECT '2') AS ig
    CROSS JOIN (SELECT '80' AS s_level UNION SELECT '100' UNION SELECT 'Late') AS sl
    LEFT JOIN current_view cv 
        ON  cv.s_date      = sd.s_date
        AND cv.part_no     = pn.part_no
        AND cv.issue_group = ig.issue_group
        AND cv.s_level     = ig.s_level
ORDER BY
    sd.s_date,
    pn.part_no,
    ig.issue_group,
    DECODE(sl.s_level, '80', 1, '100', 2, 'Late', 3)

ध्यान दें: आपने अपने आरडीबीएमएस को टैग नहीं किया। यह ओरेकल को छोड़कर उनमें से अधिकांश पर काम करना चाहिए, जहां आपको अनुमत मानों को सूचीबद्ध करने वाले प्रश्नों में प्रत्येक चयन में FROM DUAL जोड़ने की आवश्यकता है, जैसे:

(SELECT '201802' AS s_date FROM DUAL UNION SELECT '201803' FROM DUAL) AS sd
0
GMB 16 जिंदा 2019, 02:05