久光です



(2)count関数中にcase式を入れて、一度で複数の日付の範囲を集計できるようにしま
す。

count(case when dt between '2007-03-01 00:00:00' and '2007-03-31 23:59:59' then 1 else null end) as a1,

from material left join log_mate on material.id=log_mate.mate_id
and dt between '2007-1-31 0:0:0' and '2007-7-31 23:59:59' group by id,name order by id,name ;


・CASEを使って条件に合うものを別個に集計する方法
・FROMの中に日付の絞り込みも入れてしまう方法

 CASEはここで使えることが思いつかなかったです。言われてみれば使えま
すねコレが。FROMにいたってはこんな形で絞り込む条件が入れられるとは知
りませんでした。

 で、さっそく試してみたのですが、3時間ほど計算しても実行結果が返っ
てこなかったです。SQL文が間違ってたのかと思い、あれやこれや試したん
ですが全然実行結果が返ってこず。
 ログファイルが大きすぎるのかもしれないと思って、79万行あるデータを
今年の6月30日〜7月1日の2日間だけの2600行に減らして、さらにSQL文を下
記のように単純にしたところ

SELECT
material.id,
COUNT(
CASE WHEN log_mate.datetime
BETWEEN '2007-06-30 00:00:00'
AND '2007-06-30 23:59:59'
THEN 1
ELSE NULL
END ) AS a1
FROM material
LEFT JOIN log_mate ON material.id = log_mate.mate_id
AND test.datetime
BETWEEN '2007-6-29 0:0:0'
AND '2007-7-1 23:59:59'
GROUP BY material.id
ORDER BY material.id

 130秒くらいでようやく実行結果が返ってきました。結果は私が欲しがっ
ていたとおり、利用がなければ「0」が返ってくる部品一覧表になっていま
した。すごいです。ありがとうございました。

 こんどの問題は実行時間が非常に長い点です。自分のパソコン(CoreDuo
2GHz)の処理能力がひどく劣っているとも思えないし、でもSQL文はちゃん
と動作することがわかったので、まずは気長に一晩くらい回しっぱなしにし
てみます。EXCELにペタペタ貼付けてエッサホッサと行のずれを揃える仕事
を考えれば、一晩ほっといて結果一覧がでる方がかなり効率的なので。

 あとはSQL一発ってわけにはいかないけどテンポラリー・テーブルを組み
合わせる方法も現実的な速度でPHPを使わずに一覧表が作れるかもしれない
と考えてます。

 なんにせよおかげさまで進歩しました。ありがとうございます。


=================================
== HISAMITSU ISSEI ==
== DS1I-HSMT@asahi-net.or.jp ==
http://www.ne.jp/asahi/pro/his/
=================================