1

私が求めていることを明確にするために、以下の私の質問のサンプルコンテキストを少し示します...

スキーマ

Users
- id
- name

Answers
- id
- user_id
- topic_id
- was_correct

Topics
- id
- name

データ

Users
id | name
1  | Gabe
2  | John

Topics
id | name
1  | Math
2  | English

Answers 
id | user_id | topic_id | was_correct
 1 |       1 |        1 | 0
 2 |       1 |        1 | 1
 3 |       1 |        2 | 1
 4 |       2 |        1 | 0
 5 |       2 |        2 | 0

私が結果セットに入れたいのは、ユーザーごとに 1 行、トピックごとに 2 つの列を持つテーブルです。1 つはトピックの正解の合計を示し、もう 1 つは不正解の合計を示します。そのトピックのために。上記のサンプル データの場合、この結果セットは次のようになります。

私の望む結果

users.id | users.name | topic_1_correct_sum | topic_1_incorrect_sum | topic_2_correct_sum | topic_2_incorrect_sum
       1 | Gabe       | 1                   | 1                     | 1                   | 0
       2 | John       | 0                   | 1                     | 0                   | 1

明らかに、トピック テーブルにさらにトピックがあった場合、このクエリに既存のトピックごとに新しい correct_sum と illegal_sums を含めたいので、sum 関数に topic_ids をハードコーディングせずにこれを書き込む方法を探しています。私のselect句の。

ARel を使って、この種の魔法をかけるスマートな方法はありますか?

4

1 に答える 1

0

ゲイブ、

ここで探しているのは、クロス集計クエリです。これを記述するには多くのアプローチがありますが、残念ながら、SQL で十分に一般的なものはありません。私の知る限り、各データベースはクロス集計を異なる方法で処理します。これは、(OLTP ではなく) OLAP タイプのデータベースで一般的に見られる「キューブ」と見なすこともできます。

SQL で簡単に記述できますが、使用しているデータベースに固有の関数がいくつか含まれている可能性があります。どのDBを使用していますか?

あなたの回答テーブルは、IDとして1,1,1,1,1ではなく、1,2,3,4,5が必要なようです...

于 2010-12-30T11:37:57.883 に答える