![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
下記の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の記述が有るのでしょうか。
有ったら教えて欲しいのですが。若しも、無ければ従来の方法で出すだけですが。
宜しくお願いします。
No.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を組み立てるだけです
もしくはデータを全部だした上で、データがない列を削除するかですが、ロジック的には同じことです
(むしろ効率はわるい)
有難う御座います。
この件と言うのは、今迄はAccessを使って来ていたので。Accessにはこ
のクロス集計と言うのは、transformと言うクエリーでフィールド名を
意識をしないでも作れるので。
mysqlに於いてもこれと似た機能のクエリーが有るのではと思った物で
すから。
無いのですね。Accessの方が異端なのかも知れません。mysqlをする前
はAccessだけしか触った事が無かった物ですから。私の勘違いです。
そうですか。残念です。mysqlではプロシージャを使うにして寧ろ効率
は悪そうと言うのは実感する所です。と言うのは実際にそれと似た様な
事はして遅い様な気がした。
若しも、どうしてもと言うので有れば。効率を無視して作ると言う事で
すね。分かりました。その時はそれで作りたいと思います。
有難う御座いました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) Rでのスクリプトのご相談 3 2022/12/08 16:22
- Visual Basic(VBA) ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています 17 2022/12/07 12:03
- MySQL SQLです。下記の問合せを行うクエリを、PhpMyAdminで作成して実行せよ。 「昨年の各月の総降 1 2023/07/01 00:32
- Excel(エクセル) VBAで組み合わせ算出やCOUNTIFSの処理を高速化したいです。 4 2022/04/07 02:38
- Visual Basic(VBA) 列と行の名前(重複あり)が交差するセルに、データを入力したい 2 2022/06/25 22:42
- Visual Basic(VBA) 列と行の名前(重複あり)が交差するセルに、データを入力したい 3 2022/06/12 11:17
- Visual Basic(VBA) 【前回の続き続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/24 20:49
- Visual Basic(VBA) データベースから絞り込んでデータを読み込み 1 2023/02/21 19:51
- MySQL 次の時間帯の勝率の合計を求めるSQL文 1 2023/07/04 17:12
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたいの続き 5 2023/01/24 00:16
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Accessでデータシートに同じデ...
-
ACCESSで容量が50MBになった...
-
ビューのソートについて
-
Accessのテーブルデータを一気...
-
アクセス レコードセットを更...
-
SQL Server Management Studio...
-
Oracleで上書きImportはできま...
-
○SQL Server2000○複数テーブル...
-
ACCESSとEXCELLの共用
-
Accessでの稼働日数計算の方法
-
accessでレコード更新直後の反...
-
IF NOT EXISTを使用するINSERT文
-
Access無いけど.mdbが見たい!
-
ACCESS2003でメニューバーを作...
-
CSVファイルを毎日、全レコード...
-
ACCESSのクエリで、ランクテー...
-
Access VBAからエクセルに出力...
-
テーブルで一番古いレコードだ...
-
データベースを設計するときに
-
同テーブルの差分レコードの抽出
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Accessでデータシートに同じデ...
-
Accessのテーブルデータを一気...
-
テーブルで一番古いレコードだ...
-
ビューのソートについて
-
Oracleで上書きImportはできま...
-
結合テーブルでINSERTする方法...
-
accessでレコード更新直後の反...
-
このISAMでは、リンクテーブル・・
-
アクセス レコードセットを更...
-
重複クエリを使ったデータ削除
-
処理の途中で停止させ、再開さ...
-
マテリアライズドビューとスナ...
-
同一テーブルのデータを参照し...
-
ERROR1062:Duplicate entry.......
-
「クリップボードにコピーされ...
-
ORA-01401が表示され、データが...
-
ACCESSで容量が50MBになった...
-
Accessでの稼働日数計算の方法
-
構文エラー : 演算子がありませ...
-
MS Accessを共有した際にファイ...
おすすめ情報
最終的にはどのカラムが使われているのかは結果を見て見ないと分かりませんので。
順番にwhereで条件をスキャンするしか無いですが。
例えば、alter table drop column not exists (select * from table1 where id=***);
の様に出来れば良いのですが。これは構文的にはエラーですが。
要は、select句の結果をサブクエリーで求めてその結果がゼロの時は、
alter table drop columnを実行すると言う様な事をやりたいのですが。
然し、この時に問題となるのは、スキャンをすると言う所がmysql単体では難しそうですが。
変数を使うと言う事はあるとは思いますが。良く分かりません。
やりたい事と言うのは、その様な事です。
知恵を貸して下さい。
下記も駄目です。
if not exists (select * from action where id='05') then alter table クロス集計 drop column 中;
何か良い方法は無いでしょうか。