[前][次][番号順一覧][スレッド一覧]

mysql:6817

From: Shinya Kawaji <Shinya Kawaji <kawaji@xxxxxxxxxx>>
Date: Thu, 09 Jan 2003 16:51:10 +0900
Subject: [mysql 06817] Re: 日付型の条件検索について

かわじ、です。


ちょっと引用が長いですが・・・

> table1 は、
> 
> f_date_time|aaa|bbb|ccc|ddd|eee|fff
> ―――――+――+――+――+――+――+――
> 2003-01-01| 0 | 1 | 0 | 1 | 2 | 4 | 1
> 2003-01-02| 0 | 3 | 0 | 0 | 2 | 1 | 1
> 2003-01-03| 3 | 0 | 4 | 7 | 3 | 4 | 0
> 2003-01-04| 0 | 2 | 0 | 0 | 2 | 2 | 1
> ・
> ・
> と、5年分の日付データとそれぞれ数字が入っております。
> 
> table2 は、
> 
> f_name|f_code
> ―――+―――
> あいうえお| aaa
> かきくけこ|bbb
> さしすせそ|ccc
> たちつてと| ddd
> なにぬねの|eee
> はひふへほ| fff
> 
> となっております。
> 
> 結果として、ブラウザに、
> 
>       |1日|2日|3日|・・・・
> あいうえお| 0 | 0  |  3  |
> かきくけこ| 2 | 1  |  3  |
> さしすせそ| 0 | 0  |  3  |
> ・
> ・
> と、言った感じのテーブル構造で表示したいのですが、
> よく分かりません。
> 
> どなたか教えて頂けないでしょうか?


私の理解では、普通、「他のテーブルのフィールド名をデータとして入れる」
ことはしません。

入れるとしたら、「他のテーブルのデータ」です。


上記の場合でしたら、table1をまず、以下のようにする方が
良いと思いますが、いかがでしょう?(table3としています)

mysql> select * from table3;
+------+-------------+--------+-------+
| f_id | f_date_time | f_code | f_num |
+------+-------------+--------+-------+
|    1 | 2003-01-01  | bbb    |     1 |
|    2 | 2003-01-01  | ddd    |     1 |
|    3 | 2003-01-01  | eee    |     2 |
|    4 | 2003-01-01  | fff    |     4 |
|    5 | 2003-01-02  | bbb    |     3 |
|    6 | 2003-01-02  | eee    |     2 |
|    7 | 2003-01-02  | fff    |     1 |
|    8 | 2003-01-03  | aaa    |     3 |
|    9 | 2003-01-03  | ccc    |     4 |
|   10 | 2003-01-03  | ddd    |     7 |
|   11 | 2003-01-03  | eee    |     3 |
|   12 | 2003-01-03  | fff    |     4 |
|   13 | 2003-01-04  | bbb    |     2 |
|   14 | 2003-01-04  | eee    |     2 |
|   15 | 2003-01-04  | fff    |     2 |
+------+-------------+--------+-------+
15 rows in set (0.00 sec)


こうしてあれば、f_nameとf_date_timeのクロス集計は、以下のように出来ます。

mysql> SELECT
    ->   t2.f_name,
    ->   SUM(IF(FIELD(t3.f_date_time,'2003-01-01'),t3.f_num,0)) as '1日',
    ->   SUM(IF(FIELD(t3.f_date_time,'2003-01-02'),t3.f_num,0)) as '2日',
    ->   SUM(IF(FIELD(t3.f_date_time,'2003-01-03'),t3.f_num,0)) as '3日'
    -> FROM
    ->   table2 as t2
    ->   left join table3 as t3 using (f_code)
    -> GROUP BY
    ->   t2.f_name
    -> ;
+------------+------+------+------+
| f_name     | 1日  | 2日  | 3日  |
+------------+------+------+------+
| あいうえお |    0 |    0 |    3 |
| かきくけこ |    1 |    3 |    0 |
| さしすせそ |    0 |    0 |    4 |
| たちつてと |    1 |    0 |    7 |
| なにぬねの |    2 |    2 |    3 |
| はひふへほ |    4 |    1 |    4 |
+------------+------+------+------+
6 rows in set (0.00 sec)


実際には、上記のSELECT文は、表示させる日付の範囲に応じて適宜、
プログラム側で生成させる必要があるでしょう。

「クロス集計」についてはこちら。
http://www.mysql.gr.jp/mysqlml/search.cgi?ml=mysql&body=%A5%AF%A5%ED%A5%B9%BD%B8%B7%D7


# と書きましたが、上記のようなやり方で本当に良いのか、
# ちょっと自信なかったりして。

--
Shinya Kawaji



[前][次][番号順一覧][スレッド一覧]

      6807 2003-01-08 22:03 [<lavlav@xxxxxxxxxx> ] Re: 日付型の条件検索について            
->    6817 2003-01-09 16:51 ┣[Shinya Kawaji <kawaj]                                       
      6820 2003-01-09 18:12 ┃┗[<lavlav@xxxxxxxxxx> ]                                     
      6822 2003-01-09 19:20 ┃ ┗[Shinya Kawaji <kawaj]                                   
      6818 2003-01-09 17:38 ┗[谷中 <yanakas@xxxxxx]                                       
      6819 2003-01-09 18:03  ┗[<lavlav@xxxxxxxxxx> ]