2010-06-22 18 views
5

शामिल हैं, मैं दिए गए तिथियों के बीच के सभी महीनों के लिए प्रति माह औसत मूल्य प्राप्त करने के लिए एक MySQL क्वेरी लिखने का प्रयास कर रहा हूं।दिए गए दिनांक अवधि के भीतर सभी महीनों का चयन करें, जिनमें 0 मान

क्वेरी,

SELECT AVG(value1) as avg_value_1, 
AVG(value2) as avg_value_2, 
MONTH(save_date) as month, 
YEAR(save_date) as year 
FROM myTable 
WHERE save_date BETWEEN '2009-01-01' AND '2009-07-01' 
GROUP BY YEAR(save_date), MONTH(save_date) 

avg_value_1 | avg_value_2 | month | year 
    5  |  4  | 1 | 2009 
    2  |  1  | 2 | 2009 
    7  |  5  | 3 | 2009 
    0  |  0  | 4 | 2009 <--- 
    6  |  5  | 5 | 2009 
    3  |  6  | 6 | 2009 

तुम देखो की तरह कुछ है, कोई मान अप्रैल 2009 के दौरान दर्ज किए गए थे, फिर भी मैं इसे के रूप में उत्पादन में 0, 0 मूल्य दिखाना चाहते हैं: मेरा विचार यह है। इसे कैसे प्राप्त किया जाए इस पर कोई विचार? क्या यह MySQL के भीतर किया जा सकता है?

उत्तर

6

मैं लिवेन के उत्तर से सहमत हूं जिसमें एक सारणी है जिसमें आपको हर महीने की आवश्यकता हो सकती है, और इसका उपयोग अपनी परिणाम तालिका में "बाएं जॉइन" करने के लिए करें। याद रखें, यह वास्तव में एक छोटी सी तालिका है, जो आपके पास डेटा के प्रति वर्ष केवल 365 (आईएसएच) पंक्तियां हैं ... और आप आसानी से इस तालिका को पॉप्युलेट करने के लिए कुछ कोड लिख सकते हैं

हम इसे यहां करते हैं, और यह बहुत कुछ देता है लाभ, उदाहरण के लिए, निम्नलिखित फ़ील्ड (और किसी भी अन्य के बारे में सोच सकते हैं!) के साथ मासिक डेटा तालिका की कल्पना करें, किसी दिए गए सीमा में सभी महीनों के लिए पूरी तरह से आबादी;

  • की तारीख (उदाहरण के लिए 2009-04-01)
  • दिवस (उदाहरण के लिए 1)
  • सप्ताह का दिन (उदाहरण के लिए बुधवार)
  • महीना (उदाहरण के लिए 4)
  • वर्ष (उदा 2009)
  • वित्तीय वर्ष (उदाहरण के लिए 2009/10)
  • वित्तीय क्वार्टर (उदाहरण के लिए 2009Q1)
  • कैलेंडर तिमाही (उदाहरण के लिए 2009Q2)
  • +०१२३५१६४१०

फिर उपरोक्त अपनी क्वेरी के साथ इसे संयोजित करें;

 
SELECT `DT`.`myYear`, `DT`.`myMonth`, 
      AVG(`myTable`.`value1`) as avg_value_1, 
      AVG(`myTable`.`value2`) as avg_value_2 

FROM `dateTable` as DT 
LEFT JOIN `myTable` 
    ON `dateTable`.`myDate` = `myTable`.`save_date` 

WHERE `dateTable`.`myDate` BETWEEN '2009-01-01' AND '2009-07-01' 

GROUP BY `DT`.`myYear`, `DT`.`myMonth` 

के रूप में मैं नहीं किया है परीक्षण टेबल बना कर पाए मेरे एसक्यूएल कोड में कुछ त्रुटियों हो सकता है लेकिन उम्मीद है कि आपको प्रिंसिपल मिलता है और आपकी आवश्यकताओं के अनुरूप बदल जाएगा!

इस का उपयोग करना, आप जो कुछ भी "dateTable" तालिका में है करने के लिए "द्वारा समूह" खंड अपने को बदल सकते हैं, जो आप आसानी से वित्तीय तिमाही से रिपोर्ट करने के लिए अनुमति दे सकते हैं, माह, दिन, सप्ताह का दिन, आदि

आशा है कि मदद करता है!

2

संभवतः महीनों और वर्षों वाली तिथि तालिका बनाने का सबसे आसान तरीका है और इसे अंतिम परिणाम के साथ जोड़ना है।

+0

आपके उत्तर के लिए धन्यवाद, लेकिन क्या मुझे वास्तव में सभी संभावित तिथियों वाली एक तालिका की आवश्यकता है? यह सबसे आसान तरीका नहीं हो सकता है! :) –

+0

उन मानों को वापस करना मुश्किल है जो मौजूद नहीं हैं। :) –

+0

गुड प्वाइंट लाइवन, लेकिन सामान्य GetDate() और DateAdd() और इसी तरह का उपयोग करते समय MySQL दिल से सभी तिथियों के बारे में जानता है .. मुझे लगता है कि उन्हें लाने का एक तरीका होना चाहिए! –