2010-12-29 2 views
1

Вот немного контекста образца для моего вопроса ниже, чтобы помочь прояснить, что я спрашиваю ...Возможно ли построить динамические столбцы агрегата в запросе ARel, который использует соединение?

Зонирование

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 

Что Я бы хотел, чтобы в результирующем наборе была таблица с одной строкой для каждого пользователя и два столбца на одну тему, которая отображает сумму правильных ответов для темы, который отображает сумму неправильных ответов для этой темы. Для данных примера выше, этот результирующий набор будет выглядеть так:

Моего желаемого результата

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 и errors_sums для каждой темы, которая существует, поэтому я ищу способ написать это без жесткого кодирования topic_ids в функции sum моего предложения select.

Есть ли разумный способ магии такого рода с помощью AREL?

ответ

0

Гейб,

Что вы ищете здесь перекрестный запрос. Существует много подходов к написанию этого, к сожалению, ни один из них не будет достаточно общим для SQL. AFAIK каждая база данных обрабатывает кросс-таблицы по-разному. Другой способ взглянуть на это - это «куб», что обычно встречается в базах данных типа OLAP (в отличие от OLTP).

Его легко можно записать в SQL, однако, скорее всего, будут включены некоторые функции, родные для используемой вами базы данных. Какую БД вы используете?

Ваша таблица ответов выглядит, как он должен иметь 1,2,3,4,5 и не 1,1,1,1,1 как ид ...

+0

Спасибо за ответ, Стивен. В моем случае я использую Postgresql, и у меня есть запрос, который мне уже нужен, написанный на SQL, это просто icky sql, который я не люблю и надеялся увидеть, в основном для моего назидания, если AREL может мне помочь сделайте это в Rails 3. –

 Смежные вопросы

  • Нет связанных вопросов^_^