是否可以在使用连接的ARel查询中构造动态聚合列?

时间:2010-12-29 04:25:15

标签: sql ruby-on-rails ruby-on-rails-3 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和incorrect_sums,所以我正在寻找一种方法来编写这个,而不需要将topic_ids硬编码到我的select子句的sum函数。

有没有一种聪明的方法可以用ARel来制造这类东西?

1 个答案:

答案 0 :(得分:0)

加布,

您在这里寻找的是交叉表查询。有很多方法可以编写这个,遗憾的是在SQL中它们都不够通用。 AFAIK每个数据库以不同方式处理交叉表。另一种看待它的方式是作为“多维数据集”,通常在OLAP类型的数据库中找到(与OLTP相反)。

它可以在SQL中轻松编写,但可能包含您正在使用的数据库的一些本机函数。你在用什么数据库?

您的答案表看起来需要1,2,3,4,5而不是1,1,1,1,1作为ID ......