汇总来自多个记录的数据

时间:2014-02-04 00:10:52

标签: sql postgresql aggregate-functions

我正在尝试使用PostgreSQL创建一个报告,该报告列出了医生,特定问题的评分数以及这些评分的平均值作为一条记录。

我做了以下简单的查询:

select p.token, count(r.id), avg(a.val)
from xx.tb1 r
inner join xx.tb2 p using (id)
inner join xx.tb3 a using (id)
where a.question_id = 1
group by token

将连续的question_id添加到查询中的最有效方法是什么?我可以在多个select语句中使用相同的简单查询,但这似乎不是最有效的方法。工会将无法工作,因为我希望医生将数据分组。

谢谢!

1 个答案:

答案 0 :(得分:0)

您只需将question_id添加为列即可。然后,当您有问题时,每位医生都会有尽可能多的行。

select p.token, a.question_id, count(r.review_id), avg(a.val_num_raw)
from xx.review r
inner join xx.predicate p using (predicate_id)
inner join xx.answer a using (review_id)
group by token, a.question_id

修改 根据您在下面的评论,你应该A)在像Excel这样的工具中转动你的数据(或者使用可以作为特征转动的MS SQL 2012)或者B)构建一个类似下面的可怕查询:

select q1.token, q1.cnt, q1.av, q2.cnt, q2.av, ...
FROM (
    select p.token, count(r.review_id) as cnt, avg(a.val_num_raw) as av
    from xx.review r
    inner join xx.predicate p using (predicate_id)
    inner join xx.answer a using (review_id)
    where question_id = 1
    group by token) q1
LEFT JOIN (
    select p.token, count(r.review_id) as cnt, avg(a.val_num_raw) as av
    from xx.review r
    inner join xx.predicate p using (predicate_id)
    inner join xx.answer a using (review_id)
    where question_id = 2
    group by token) q2 using (token)
LEFT JOIN (
    select p.token, count(r.review_id) as cnt, avg(a.val_num_raw) as av
    from xx.review r
    inner join xx.predicate p using (predicate_id)
    inner join xx.answer a using (review_id)
    where question_id = 3
    group by token) q3 using (token)

我会转向,因为这个查询的性能会很糟糕。