質問: MySQLの質問です。最初にSQL文を教えてくださった方には300ポイントさしあげます。困っています。どうぞよろしくお願いします。m(。。)m (日付) (商品名) (数量) 2010-08-01 消しゴム 14 2010-08-01 えんぴつ 13 2010-08-01 定規 1 2010-08-02 消しゴム 5 2010-08-02 えんぴつ 10 2010-08-02 定規 3 2010-08-03 消しゴム 4 2010-08-03 えんぴつ 6 2010-08-03 定規 8 というテーブルから、以下のような出力を得たいのですが、 どのようにselect文をかけばよいのでしょうか? 消しゴム えんぴつ 定規 2010-08-01 14 13 1 2010-08-02 5 10 3 2010-08-03 4 6 8
回答: 【1】集計は必須 >日付x商品はkeyになっているので、1つの日付x商品の組み合わせに対しては1つのレコードしかありません。 >ですので、sumは使わなくても大丈夫だと思います。。 INSERTはUNIQUE判定を行いますが、 SELECTにおいてはUNIQUE判定は行われないためsumは必要な措置となります 【2】一度にはできない。一度に行う必要も無い >商品名は1000以上あるので、それぞれを入力していくわけにはいかない 当然でてくるだろうと想定しておくべき事柄ですね 残念ながらMySQLにはPIVOT/クロス集計機能は無く回答1の手段を用いることになります 【3】対処 (例1)回答1のSQLを参考に、phpなどで、その場その時に必要なフィールドだけに絞ったSQLを生成して発行 フィールド名が都度変わるため処理は煩雑で面倒 (例2)縦一列の形で集計したものをphp側で横一列として画面出力や印刷を行う 日付x商品はkeyになっているので集計の必要も無く、 phpなどで先頭から1レコードずつ読み出して横に書き並べ、日付が変わったら改行するだけで簡単です ``` SELECT * FROM テーブル名 WHERE (日付 BETWEEN '2010-08-01' AND '2010-08-03') AND (商品コード BETWEEN 100 AND 150); ``` 過去の質問を閲覧しても利用言語環境が分からないので、ひとまずここまでにしておきます 参考URLはいまのところありません