user_answers
データベースに、一連の質問に対するユーザーの回答を行で保存するテーブルがあります。user_id
、question_id
、answer_id
およびtext_entry
。質問テキストと回答テキスト (存在する場合) はルックアップ テーブルに格納されます。問題には、単一回答問題、複数回答問題、文字入力問題の 3 種類があります。そのため、1 人のユーザーがuser_answers
テーブルに次のようなエントリを持つ可能性があります。
user_id question_id answer_id text_entry
------- ----------- --------- ----------
123 100 1010 (null)
123 200 2010 (null)
123 200 2030 (null)
123 300 3000 "code 789"
questions_text
テーブルに次のものがあるとしましょう。
question_id text
----------- -------------
100 "Gender"
200 "Interests"
300 "Your code"
answers_text
テーブルには次のものがあります。
answer_id text
--------- -----------
1010 "Female"
1020 "Male"
2010 "Sports"
2020 "Computers"
2030 "Movies"
3000 (null)
次のように、user_id ごとに 1 行で回答を示す csv にデータを抽出したいと考えています。
User,Gender,Sports,Computers,Movies,Code
123,Female,1,0,1,code 789
SQLPlus 経由で CSV ファイルを生成する方法は知っていますが (自分では制御できない理由で SQLPlus 経由でのみ DB にアクセスできます...)、PL/SQL ステートメントを生成する方法がわかりません。
PL/SQLでは、次のようにして性別の質問のピボットを生成できることを知っています
SELECT
user_id || ',' ||
MIN(DECODE(question_id, '100', (SELECT text FROM answers_text where answer_id = answer_text.answer_id)))
FROM user_answers
GROUP BY user_id
ORDER BY user_id
;
(私は SQL の専門家ではないので、これはインターネットからコピーされたものです!)
このコードは (少なくとも私のテストでわかっている限りでは) 単一回答の質問には適していますが、複数回答またはテキスト入力タイプの質問では機能しません。
case
次のように、PL/SQL でステートメントを使用することについてオンラインでいくつか見ました。
MIN(CASE WHEN question_id = '200' AND answer_id = '2010' THEN '1' ELSE '0' END)
...しかし、回答を列に入れる方法がわかりません。そして、関連する可能性のあるSOの質問はすべて、SQLサーバー固有のものです。
単一の PL/SQL ステートメントから目的の出力を生成する方法はありますか? これを実行する必要がある可能性のあるデータベースが多数あるため、テーブル内のデータに依存しない方法で作成することをお勧めします。