- ベストアンサー
【SQL】項目に紐づいている情報を取得したい
- Excelシートを一つのデータベースとみなして利用するプログラムを作成している。データベースのある項目に紐づいている3つの項目から登録件数の多いものを抽出したい。
- データベースは登録区分と登録理由の3つの項目からなる。データベースから選択した区分に対して登録された理由の件数を抽出し、件数の多い順に並び替えたい。
- Excel2010でADOを使用してデータベースアクセスを行っており、3つの列のデータを統合した上で件数を出す方法が分からない。Windowsを使用している。
- みんなの回答 (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 だけだと 区分, 理由 の重複を除去した結果を返す、の違いです。
その他の回答 (2)
- bin-chan
- ベストアンサー率33% (1403/4213)
#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 区分 ;
- bin-chan
- ベストアンサー率33% (1403/4213)
まず、集計のルールは不明確なので例示データの確認をさせてください。 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]とあるのは正しい? 見直しましたがこちらは正しいと思います。 よろしくお願いいたします。
お礼
こちらの回答を元にSQLを作成してみましたが、結果としては思うように件数を 取得することができませんでした。 ご教授いただいた3つのSELECT文を単体で動かした場合は適切な件数を取得できるの ですが、この3つをUNION ALLで結合しFROM句に埋め込んで実行すると上手くいかないようです。 ですので路線を修正し、あえて3つのSELECT文をバラで実行した後、取得した結果を用いて 力技で件数の集計を行うことにしました。 理想的な結果にならかなったとはいえ今回の件で本当に参考になりました。 ありがとうございます。
補足
回答ありがとうございます。 こちらの案ですが、私が行ったテストでは接続にUNION ALLではなくUNIONを使って実行していました。 この場合は合計値が正しいものにならなかったのですが、一度UNION ALLを使用してテストしてみます。