
お世話になります。
Excelシートを一つのデータベースとみなして利用するプログラムを作成しているのですが、
データベースのある項目に紐づいている3つの項目から登録件数の多いものを抽出したいと
考えています。
<データベース内容>
↓データベースの中身
区分|理由1|理由2|理由3
1 | 5 | 7 | 6
1 | 5 | 7 | 5
2 | 7 | 6 | 5
・登録区分1つに対して登録理由を3つまで入力できるデータベースです。なぜデータベース
なのに理由欄が複数あるのかと疑問だと思うのですが、訳あってこの形を崩すことはできません。
上記のデータベースを使用してやりたいことは以下のとおりです。
(1)データベースから区分を選出
(2)その区分に対して登録された理由の件数を抽出
(3)抽出した件数の多い順に並び替え
(なんとなくこんな感じです。)
<抽出結果(区分1の場合)>
理由|件数
5 | 3
7 | 2
6 | 1
私の方でも上記のような結果になるよう考えてみたのですが、どうしても3つの列のデータを
統合した上で件数を出す方法が分からず悪戦苦闘しております。
ちなみに、使用しているOSはWindowsで、Excel2010でADOを使用してデータベースアクセスを
行っています。ADOは旧バージョンで.Netではありません。
説明が大雑把で申し訳ありませんが、良い案が御座いましたらご教授ください。
よろしくお願いいたします。
No.3ベストアンサー
- 回答日時:
#1、#2です。
すみません。漏れがあるので訂正。select 区分, 理由1 as 理由 from <テーブル名>
UNION ALL
select 区分, 理由2 as 理由 from <テーブル名>
UNION ALL
select 区分, 理由3 as 理由 from <テーブル名>
;
です。
UNION と UNION ALLの違いは、
UNION ALLだとおのおののselect結果すべてを返す、
UNION だけだと 区分, 理由 の重複を除去した結果を返す、の違いです。
No.2
- 回答日時:
#1ですが、補足が無い状態で推測して作りました。
仕様に応じて適宜変更してください。
1)以下の3つのSELECT文を作成して、UNION ALL で結合するクエリを作成。
・区分|理由1
・区分|理由2
・区分|理由3
つまり
select 区分, 理由1 as 理由
UNION ALL
select 区分, 理由2 as 理由
UNION ALL
select 区分, 理由3 as 理由
;
2)そのクエリ(列は区分, 理由)を元に集計する。
select 区分, count(理由) as 件数
from <上記のユニオンクエリ名>
group by 区分
;
この回答への補足
回答ありがとうございます。
こちらの案ですが、私が行ったテストでは接続にUNION ALLではなくUNIONを使って実行していました。
この場合は合計値が正しいものにならなかったのですが、一度UNION ALLを使用してテストしてみます。
こちらの回答を元にSQLを作成してみましたが、結果としては思うように件数を
取得することができませんでした。
ご教授いただいた3つのSELECT文を単体で動かした場合は適切な件数を取得できるの
ですが、この3つをUNION ALLで結合しFROM句に埋め込んで実行すると上手くいかないようです。
ですので路線を修正し、あえて3つのSELECT文をバラで実行した後、取得した結果を用いて
力技で件数の集計を行うことにしました。
理想的な結果にならかなったとはいえ今回の件で本当に参考になりました。
ありがとうございます。
No.1
- 回答日時:
まず、集計のルールは不明確なので例示データの確認をさせてください。
2行目の理由3が値[5]とあるのは正しい?
同一選択肢ありで重複排除なんですか?
理由の値[7]の件数が[2]とあるのは正しい?
この回答への補足
回答ありがとうございます。
>同一選択肢ありで重複排除なんですか?
Excelで作っている擬似データベースですので、同一選択肢が混入する場合はあります。
(つまり、入力時に強制力のある仕組みが存在しない。)
ですが、運用ルールでフォロー可能ですので無視して頂いてもOKです。
それともう一つ記載漏れがありましたが、理由欄は必須ではなく未入力の部分が存在します。
上記の内容を加味してデータベース例を更新しましたので、以下のもの参照ください。
<データベース内容>
区分|理由1|理由2|理由3
1 | 5 | 7 | 6
1 | 5 | 7 |
1 | 7 | |
2 | 7 | 6 | 5
<抽出結果(区分1の場合)>
理由|件数
7 | 3
5 | 2
6 | 1
>理由の値[7]の件数が[2]とあるのは正しい?
見直しましたがこちらは正しいと思います。
よろしくお願いいたします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
1つのSQLで2段階の抽出を行い...
-
【SQL】項目に紐づいている情報...
-
limit offset はupdate文には使...
-
AccessVBAについて テーブルの...
-
【SQL】他テーブルに含まれる値...
-
フラグをたてるってどういうこ...
-
SELECT INTOで一度に複数の変数...
-
改行を含んだデータのインポート
-
UPDATEで既存のレコードに文字...
-
PRIMARY KEYのコピー
-
エラーを起こす方法
-
truncate tableを使って複数の...
-
PostgreSQLのtimestamp型で時間...
-
SQLサーバに対するSQL文で抽出...
-
追加クエリで重複データなしで...
-
Accessの構成をコピーしたい
-
sqlに記述できない文字
-
ExcelのMatch関数のようなもの...
-
PostgreSqlのシステムスキーマ...
-
既存データをINSERT文にして出...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
1つのSQLで2段階の抽出を行い...
-
SQLで、過去で一番大きい日付の...
-
mySQLの抽出条件について
-
limit offset はupdate文には使...
-
MySQL(4.1)でのサブクエリ...
-
画像に何が写っているかを示す...
-
こちらのテーブルにあってこち...
-
SQLで、指定日条件のSQL文
-
AccessVBAについて テーブルの...
-
SQL文の書き方
-
DBに'no'というint型のフィール...
-
SQLでレコード間の値の交換
-
DAOで同値更新するとException発生
-
【SQL】他テーブルに含まれる値...
-
フラグをたてるってどういうこ...
-
SELECT INTOで一度に複数の変数...
-
sqlに記述できない文字
-
SQLサーバに対するSQL文で抽出...
-
UPDATEで既存のレコードに文字...
-
エラーを起こす方法
おすすめ情報