2010-06-22 15 views
5

olanlar da dahil olmak üzere belirli bir tarih aralığı içinde tüm ayları seçin Belirli bir tarih arasında tüm aylar için ayda ortalama bir değer elde etmek için bir MySQL sorgusu yazmaya çalışıyorum. Hiçbir değer Nisan 2009'da sırasında girildi0 değerleri

Görüyorsunuz
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 

gibi bir şey,

Sorgu, henüz ben çıktıda bir 0, 0 değeri olarak gösterilmesini istiyorum: Benim fikrim budur. Bunu nasıl başaracağınıza dair herhangi bir fikir var mı? MySQL içinde yapılabilir mi?

cevap

6

Lieven'in cevabına katılacağınız tüm ayları içeren bir tablo oluşturun ve bunu sonuç tablonuza "SOL JOIN" olarak kullanın. Unutmayın, bu gerçekten küçük bir tablo, sahip olduğunuz verilerin yılda sadece 365 (ish) satırı var ... Ve kolayca bu tabloyu doldurmak için bir kod yazabilirsiniz

Bunu burada yapıyoruz ve çok faydalar, örneğin, belirli bir aralıkta tüm aylar için tamamen doldurulmuş olan aşağıdaki alanları (ve aklınıza gelebilecek başkalarını!) içeren bir aylık veri tablosu hayal edin;

  • Tarih (Örn 2009-04-01)
  • Günü (Örn 1)
  • Haftanın Günü (Örn Çarşamba)
  • Ay (Ör 4)
  • Yıl (2009 Örn)
  • Mali Yıl (Örn 2009/10)
  • Mali Çeyrek (Örn 2009Q1)
  • Takvim Çeyrek (Örn 2009Q2)

Bunu daha sonra, yukarıdaki sorgu ile birleştirerek, aşağıdaki gibi;

 
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` 

Orada testi tablo oluşturmak mümkün olmamıştır olarak benim SQL kodunda bazı hatalar olabilir, ama umarım müdürüne almak ve ihtiyaçlarınıza göre değiştirebilir edeceğiz! Bu kullanma

, size kolayca Finansal Bölge ile rapor izin verebilir, hangi sen "dateTable" tablosunda her ne kadar maddesi "GROUP BY" senin değiştirebilir, vb Ay, Gün, Haftanın Günü,

Bu yardımcı olur umarım!

2

Muhtemelen en kolay yolu aylar ve yıllar içeren bir tarih tablosu oluşturmak ve bunu nihai sonucunuzla birleştirmektir.

+0

Cevabınız için teşekkürler, ancak tüm tarihleri ​​içeren bir tabloya gerçekten ihtiyacım var mı? Bu en kolay yol olamaz! :) –

+0

Mevcut olmayan değerleri döndürmek zor. :) –

+0

İyi bir nokta Lieven, ama sıradan GetDate() ve DateAdd() ve benzeri kullanırken MySQL tüm tarihleri, kalpten bilir .. Sadece onları almanın bir yolu olması gerektiğini hissediyorum! –