5

特定の日付までのすべての月について、1か月あたりの平均値を取得するMySQLクエリを作成しようとしています。私の考えはこれです:

クエリ、のようなもの

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年4月には値が入力されていませんが、出力に0、0の値として表示されるようにしたいと思います。これを達成する方法について何かアイデアはありますか?MySQL内で実行できますか?

4

2 に答える 2

6

Lievenの回答に同意します。これまでに必要となる可能性のあるすべての月を含むテーブルを作成し、それを使用して結果テーブルに「LEFTJOIN」します。これは非常に小さなテーブルであり、1年に365(ish)行のデータしかありません...そして、このテーブルに最初に入力するコードを簡単に記述できます。

ここでこれを行います。これにより、多くの利点が得られます。たとえば、次のフィールド(および考えられるその他のフィールド)が特定の範囲のすべての月に完全に入力された月次データテーブルを想像してみてください。

  • 日付(例: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

DTとしての`dateTable`から
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`

テストテーブルを作成できなかったため、SQLコードにエラーが発生する可能性がありますが、プリンシパルを取得して、ニーズに合わせて変更できることを願っています。

これを使用して、「GROUP BY」句を「dateTable」テーブルにあるものに変更できます。これにより、四半期、月、日、曜日などで簡単にレポートできます。

お役に立てば幸いです。

于 2010-06-24T15:31:17.533 に答える
2

最も簡単な方法は、月と年を含む日付テーブルを作成し、これを最終結果と結合することです。

于 2010-06-22T14:17:37.313 に答える