dポイントプレゼントキャンペーン実施中!

下記のsqlでテーブルとデータを用意する。
create table 収穫 (登録日 date,番号 int,容量 text(1));
insert into 収穫 values ('160201',1,'s'),('160201',2,'m'),('160202',3,'m'),('160203',4,'s');

容量はs,m,lの3種類がある。然し、データとしては全てがそろうとは限らないとする。
前持ってデータを決め打ちが出来ないので出カのテーブルは全てを用意をすると
create table クロス集計
as select
登録日
,sum(case 容量 when 's' then 1 else 0 end) as s
,sum(case 容量 when 'm' then 1 else 0 end) as m
,sum(case 容量 when 'l' then 1 else 0 end) as l
,count(*) as 合計
from 収穫
group by 登録日
;

上記を実行すると確かにクロス集計のテーブルは出来ますが。然し、今回の様に必ずしも列見出しが3個とは限りません。若しも、これが大量に増えた場合は非常にsqlを組み立てるのがめんどうになります。また、見た目にもデータが全く無いのにも関わらずに列見出しとしては存在をしますので。

非常に煩わしくなります。こう言う事が有る為に、この問題を避けるために別のプログラムで予めそのデータが有るのかをチェックしてsqlを作っていますが。

この様な方法(この場合は、プログラムでデータが有るのかをチェックしてsqlを組み立てると言う方法)
以外にmysqlでのsqlの記述が有るのでしょうか。

有ったら教えて欲しいのですが。若しも、無ければ従来の方法で出すだけですが。

宜しくお願いします。

質問者からの補足コメント

  • うーん・・・

    最終的にはどのカラムが使われているのかは結果を見て見ないと分かりませんので。
    順番にwhereで条件をスキャンするしか無いですが。
    例えば、alter table drop column not exists (select * from table1 where id=***);
    の様に出来れば良いのですが。これは構文的にはエラーですが。

    要は、select句の結果をサブクエリーで求めてその結果がゼロの時は、
    alter table drop columnを実行すると言う様な事をやりたいのですが。
    然し、この時に問題となるのは、スキャンをすると言う所がmysql単体では難しそうですが。
    変数を使うと言う事はあるとは思いますが。良く分かりません。
    やりたい事と言うのは、その様な事です。

    知恵を貸して下さい。

      補足日時:2016/02/21 00:41
  • うーん・・・

    下記も駄目です。
    if not exists (select * from action where id='05') then alter table クロス集計 drop column 中;

    何か良い方法は無いでしょうか。

      補足日時:2016/02/21 00:57

A 回答 (1件)

>大量に増えた場合は非常にsqlを組み立てるのがめんどうになります。



そうでもないと思いますが・・・
create table クロス集計 select 登録日 ,sum(容量='s') as s ,sum(容量='m') as s ,sum(容量='l') as s ,count(*) as 合計 from 収穫 group by 登録日;

>見た目にもデータが全く無いのにも関わらずに列見出しとしては存在をしますので。

SQLとはそういうものです、データがないということを集計するのもSQLの仕事ですから

>この様な方法(この場合は、プログラムでデータが有るのかをチェックしてsqlを組み立てると言う方法)
>以外にmysqlでのsqlの記述が有るのでしょうか。

ないですね
プロシージャでやっても結局データがあるかどうかチェックしてからSQLを組み立てるだけです
もしくはデータを全部だした上で、データがない列を削除するかですが、ロジック的には同じことです
(むしろ効率はわるい)
    • good
    • 0
この回答へのお礼

有難う御座います。

この件と言うのは、今迄はAccessを使って来ていたので。Accessにはこ
のクロス集計と言うのは、transformと言うクエリーでフィールド名を
意識をしないでも作れるので。

mysqlに於いてもこれと似た機能のクエリーが有るのではと思った物で
すから。

無いのですね。Accessの方が異端なのかも知れません。mysqlをする前
はAccessだけしか触った事が無かった物ですから。私の勘違いです。

そうですか。残念です。mysqlではプロシージャを使うにして寧ろ効率
は悪そうと言うのは実感する所です。と言うのは実際にそれと似た様な
事はして遅い様な気がした。

若しも、どうしてもと言うので有れば。効率を無視して作ると言う事で
すね。分かりました。その時はそれで作りたいと思います。

有難う御座いました。

お礼日時:2016/02/22 10:05

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!