[PHP-users 18891]Re: 検索結果を横軸に配置するには?

Chie gontakun_72 @ yahoo.co.jp
2003年 11月 13日 (木) 11:22:48 JST


Chie.Mです。
完全にSQLの内容になってしまって恐縮です。

> DB(postgres)に入力したデーターを
> 月別に横軸に配置したい

私がこのような処理を行う場合は、ほぼSQLで処理をしています。
あまりスマートなやり方ではないかもしれませんが。。。

まず、下記のようなテーブルを作ります。
--------
CREATE TABLE test_table (
    test_date date,
    test_data text
);

INSERT INTO test_table VALUES('2003-9-9','曇');
INSERT INTO test_table VALUES('2003-9-1','雨');
INSERT INTO test_table VALUES('2003-9-12','晴');
INSERT INTO test_table VALUES('2003-9-21','雨');
INSERT INTO test_table VALUES('2003-10-6','晴');
INSERT INTO test_table VALUES('2003-10-11','曇');
INSERT INTO test_table VALUES('2003-10-25','雨');
INSERT INTO test_table VALUES('2003-10-29','晴');
INSERT INTO test_table VALUES('2003-11-3','曇');
INSERT INTO test_table VALUES('2003-11-16','雨');
INSERT INTO test_table VALUES('2003-11-27','晴');
--------

月ごとに、見出しをつけてグループ化します。
--------
SELECT test_data, 
       CASE WHEN extract(month from test_date)=9 
          THEN extract(day from test_date)
       END AS September,
       CASE WHEN extract(month from test_date)=10 
          THEN extract(day from test_date)
       END AS October,
       CASE WHEN extract(month from test_date)=11
          THEN extract(day from test_date)
       END AS November
FROM test_table
GROUP BY test_data,September,October,November;
--------

上記のSQLで、下記のような表ができます。

test_data|September|October|November|
    雨      |        1     |           |               |
    雨      |      21     |           |               |
    雨      |               |   25    |               |
    雨      |               |           |       16    |
    晴      |      12     |           |               |
    晴      |               |     6    |               |
    晴      |               |    29    |               |
    晴      |               |           |      27      |
・・・・

月ごとに同じ天気の日数は変わりますので、どうしてもNULLの欄が
できてしまいます。

しかし、実際にやりたい事が下記のようなことなら、
集計関数を使えばNULLの欄はなくなります。

> (例)アイスクリームの月毎の販売数量を月毎に
>		横並びで表示させたい。

表示させる値は、月ごとの合計値などですよね。
今回の例でしたら、同じ天気の月間日数をカウントすることでできます。
--------
SELECT test_data, 
       COUNT(CASE WHEN extract(month from test_date)=9 
          THEN test_date
       END) AS September,
       COUNT(CASE WHEN extract(month from test_date)=10 
          THEN test_date
       END) AS October,
       COUNT(CASE WHEN extract(month from test_date)=11
          THEN test_date
       END) AS November
FROM test_table
GROUP BY test_data;
--------

test_data|September|October|November|
    雨      |       2      |     1     |      1      |
    晴      |       1      |     2     |      1      |
    曇      |       1      |     1     |      1      |

上記は3か月分ですが、1年分のカラムを用意しておけば、
1年分の表を作る事ができます。
工夫すれば複数年でも可能です。

いかがでしょうか?
では、頑張ってください。

-- 
Chie <gontakun_72 @ yahoo.co.jp>



PHP-users メーリングリストの案内