MySqlクエリ時の日付補完(連続)の方法
6875 ワード
MySqlクエリ時の日付補完(連続)の方法
ある日、注文表の7日前の毎日の注文数を調べる必要があります.sqlは順番に書きます.
実行すると、データが出てきましたが、連続していません.数量も7本もありません.ボスの商売は惨憺たるもので、一日に1つの注文ができないことが多いですが、プログラムにはデータがありません.だから、ここの直観的な方法は悪いデータを補うことです.どうやって補うのですか.最初に思いついたのはjavaのような上位言語で補うことです.
OK、大丈夫です.振り向くと、社長は7日間の業績は私の店が半年も開店しないで半年食べる本質を見ることができないと言って、カスタマイズして終了時間を調べて、私は言って、いいですよ.しかし、上記の方法は問題があります.本当に2年の日付を選んで調べなければなりません.それは何回循環しなければなりませんか.そこで頭を働かせて、ここからヒントを得ます:mysqlは日付グループ(group by)で統計を検索する時、データが0を補う解決方法がなくて、以下はsqlを書きます:
もういい!sqlの中の長いUNION文については、選択した日付に基づいてjavaで生成しましょう.もっといい方法があると思います.教えてください.
ある日、注文表の7日前の毎日の注文数を調べる必要があります.sqlは順番に書きます.
SELECT
DATE_FORMAT(order_time,'%Y-%m-%d') date,
count(*) orderCount
FROM
order
WHERE
date_sub(curdate(), INTERVAL 7 DAY) < date(order_time)
GROUP BY DATE_FORMAT(order_time,'%Y-%m-%d')
ORDER BY date ASC
実行すると、データが出てきましたが、連続していません.数量も7本もありません.ボスの商売は惨憺たるもので、一日に1つの注文ができないことが多いですが、プログラムにはデータがありません.だから、ここの直観的な方法は悪いデータを補うことです.どうやって補うのですか.最初に思いついたのはjavaのような上位言語で補うことです.
//
List<Map<String, Object>> orders= orderDao.queryOrder(7);
// , 0
List<String> dayList = DateUtil.dayList(7, 1,false);// 7
boolean exists=false;
for (int i=0;i<dayList.size();i++) {
exists=false;
for (Map<String, Object> hs : orders) {
if (dayList.get(i).equals(hs.get("date"))) {
exists=true;
break;
}
}
if(!exists){
final String date=dayList.get(i);
orders.add(i,new HashMap<String,Object>(){{
put("orderCount", 0);
put("datat", date);
}});
}
}
return orders;
OK、大丈夫です.振り向くと、社長は7日間の業績は私の店が半年も開店しないで半年食べる本質を見ることができないと言って、カスタマイズして終了時間を調べて、私は言って、いいですよ.しかし、上記の方法は問題があります.本当に2年の日付を選んで調べなければなりません.それは何回循環しなければなりませんか.そこで頭を働かせて、ここからヒントを得ます:mysqlは日付グループ(group by)で統計を検索する時、データが0を補う解決方法がなくて、以下はsqlを書きます:
SELECT
od.date,
od.orderCount
FROM
(
SELECT
DATE_FORMAT(order_time,'%Y-%m-%d') date,
count(*) orderCount
FROM
order
WHERE
order_time>' ' and order_time<' '
GROUP BY DATE_FORMAT(order_time,'%Y-%m-%d')
UNION (SELECT 0, '2017-03-01')
UNION (SELECT 0, '2017-03-02')
UNION (SELECT 0, '2017-03-03')
UNION (SELECT 0, '2017-03-04')
UNION (SELECT 0, '2017-03-05')
UNION (SELECT 0, '2017-03-06')
UNION (SELECT 0, '2017-03-07')
UNION (SELECT 0, '2017-03-08')
-- UNION ......
) AS od
GROUP BY od.date
ORDER BY od.date ASC
もういい!sqlの中の長いUNION文については、選択した日付に基づいてjavaで生成しましょう.もっといい方法があると思います.教えてください.