- ベストアンサー
煩雑な集計クエリの解決方法とデータ抽出の手順
- 煩雑な集計を行うためには、データ抽出と集計の手順を理解する必要があります。
- 具体的には、同じorder_idの中で一番若いdateが特定の期間に該当するデータを抽出し、それぞれのorder_idごとにpriceを合計します。
- また、2つの操作を1つのクエリで行いたい場合は、サブクエリや集約関数を使用することができます。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
> 2.1のorder_id で、dateが、2009/4/1 00:00 - 2009/4/30 24:00 の期間である price の合計値の取得 この2の取得を「dateが、2009/4/1 00:00 - 2009/4/30 24:00 の期間である order_id 毎の price の合計値の取得」にして1の取得結果とorder_idどうしでJOINする、と考えれば煩雑ではないでしょう。 1… select order_id, min(date) from test_table group by order_id having min(date) >= '2009 4/1 00:00' and min(date) < '2009 4/2 00:00' 2… select order_id, sum(price) from test_table where date >= '2009 4/1 00:00' and date < '2009 5/1 00:00' group by order_id
その他の回答 (2)
- chukenkenkou
- ベストアンサー率43% (833/1926)
ここのカテゴリ通り、RDBMSはMySQLなのでしょうか? バージョンは? >1 aaa 100 2009 4/1 00:00 年月の間に空白があるのは、記載ミスですか? date列のデータ型は、何ですか?もし、datetimeであれば年月の間に空白は許されないし、varchar等を使っているのですか?もしそうであれば、年月日などのデータ形式はどうなっているのですか? >一番若いdateが 2009/4/1 00:00-24:00 これも記載ミスでしょうか? それとも、00:00と24:00という、同じ意味の異なる表現が存在するのですか? >可能であれば、以上2つのことを1つのクエリで発行できるのか MySQL 4.1以降であれば、サブクエリが実装されているので、1文で可能です。MySQL 4.0以前なら、一時表を使ったりと、事前準備が必要になります。
- mindatg
- ベストアンサー率48% (110/227)
ぱっと、思いついたので合ってるかどうかは知らんですが SELECT *, SUM(price) FROM test_table GROUP BY order_id WHERE (date BETWEEN '2009 4/1 00:00' AND '2009 4/1 24:00') /* WHERE DATE_TRUNC('day',date) = '2009 4/1' */ /* MySQLだとTRUNC('day',date)かな? */ 参考程度に。 >以上2つのことを1つのクエリで発行できるのか 余裕っす likeで日付ごと、月ごとってのも思いついたんですがコストが掛かりそうです。