2013-09-29 2 views
5

में किसी तालिका में समूहों द्वारा गायब तिथियों को भरने के लिए कैसे मैं जानना चाहता हूं कि एसक्यूएल में समूहों द्वारा प्रारंभ/समाप्ति तिथियों के आधार पर मूल्य शून्य के साथ लापता तिथियों को भरने के लिए लूप का उपयोग कैसे करें ताकि मेरे पास लगातार समय श्रृंखला हो प्रत्येक समूह। मेरे पास दो प्रश्न हैं।एसक्यूएल

  1. प्रत्येक समूह के लिए लूप कैसे करें?
  2. कैसे प्रत्येक समूह के लिए प्रारंभ/समाप्ति दिनांक उपयोग करने के लिए गतिशील रूप से दिनांक लापता में भरने के लिए?

मेरा इनपुट और अपेक्षित आउटपुट नीचे सूचीबद्ध है।

इनपुट: तरह

date  value  grp_no 
8/06/12 1   1 
8/08/12 1   1 
8/09/12 0   1 
8/07/12 2   2 
8/08/12 1   2 
8/12/12 3   2 

इसके अलावा, मैं एक मेज बी जो एक साथ शामिल होने के लिए छोड़ दिया करने के लिए याद आ रही दिनांकों को भरने के लिए इस्तेमाल किया जा सकता है मैं एक मेज एक है।

date 
... 
8/05/12 
8/06/12 
8/07/12 
8/08/12 
8/09/12 
8/10/12 
8/11/12 
8/12/12 
8/13/12 
... 

एसक्यूएल में निम्नलिखित आउटपुट उत्पन्न करने के लिए मैं ए और बी का उपयोग कैसे कर सकता हूं?

आउटपुट:

date  value  grp_no 
8/06/12 1   1 
8/07/12 0   1 
8/08/12 1   1 
8/09/12 0   1 
8/07/12 2   2 
8/08/12 1   2 
8/09/12 0   2 
8/10/12 0   2 
8/11/12 0   2 
8/12/12 3   2 

कृपया मुझे अपने कोड और सुझाव भेज सकते हैं। अग्रिम में बहुत बहुत धन्यवाद!!!

+0

बी में कॉलम क्या हैं? – mhn

+0

इसमें केवल दिनांक कॉलम है - साल 2012 में सभी लगातार तिथियां। – user2824423

+1

आप किस डेटाबेस सिस्टम और संस्करण का उपयोग कर रहे हैं? –

उत्तर

6

आप छोरों

SELECT p.date, COALESCE(a.value, 0) value, p.grp_no 
    FROM 
(
    SELECT grp_no, date 
    FROM 
    (
    SELECT grp_no, MIN(date) min_date, MAX(date) max_date 
     FROM tableA 
    GROUP BY grp_no 
) q CROSS JOIN tableb b 
    WHERE b.date BETWEEN q.min_date AND q.max_date 
) p LEFT JOIN TableA a 
    ON p.grp_no = a.grp_no 
    AND p.date = a.date 

अंतरतम सबक्वेरी पकड़ लेता न्यूनतम और अधिकतम प्रति समूह तारीखों के बिना इस तरह कर सकते हैं। फिर TableB के साथ जुड़ने के लिए क्रॉस प्रति समूह न्यूनतम अधिकतम सीमा के भीतर सभी संभावित तिथियां उत्पन्न करता है। और अंत में बाहरी चयन TableA के साथ बाहरी जुड़ने का उपयोग करता है और TableA में अनुपलब्ध तिथियों के लिए 0 के साथ value कॉलम भरता है।

आउटपुट:

 
|  DATE | VALUE | GRP_NO | 
|------------|-------|--------| 
| 2012-08-06 |  1 |  1 | 
| 2012-08-07 |  0 |  1 | 
| 2012-08-08 |  1 |  1 | 
| 2012-08-09 |  0 |  1 | 
| 2012-08-07 |  2 |  2 | 
| 2012-08-08 |  1 |  2 | 
| 2012-08-09 |  0 |  2 | 
| 2012-08-10 |  0 |  2 | 
| 2012-08-11 |  0 |  2 | 
| 2012-08-12 |  3 |  2 | 

यहाँ है SQLFiddle डेमो

+0

आपको बहुत बहुत धन्यवाद! मैं आज कोशिश करूँगा और आपको बताएगा कि यह काम करता है! – user2824423

+1

यह सही काम करता है! बहुत बहुत धन्यवाद। – user2824423

+0

@ user2824423 आपका स्वागत है। गुड लक :) समय आयामों का उपयोग कर के एक गैर तुच्छ उदाहरण दिखाने के लिए – peterm