3个表连接计算的%

问题描述 投票:1回答:1

我有以下表格:

POLLS
id | name       | colour
-------------------------
1  | first poll | orange
2  | secon poll | blue
3  | third poll | green

QUESTIONS
id | poll_id | what_to_ask
---------------------------
1  | 1       | How nice is stackoverflow?
2  | 1       | Why do you think that?
3  | 2       | What do you like to eat?

CHOICES
id | question_id | choice_text
------------------------------------
1  | 1           | Very nice
2  | 1           | Moderatley nice
3  | 1           | Evil
4  | 2           | Etc.

Answers
id | choice_id | poll_id | question_id
--------------------------------------
1  | 1         | 1       | 1
2  | 1         | 1       | 1
3  | 2         | 1       | 1
4  | 3         | 1       | 1
5  | 1         | 1       | 1

我试图撤回以下内容:

  • 每个选项都有一行
  • 轮询附加到行的信息(这将复制,并且没关系)
  • 问题信息附加到行(这将复制,它没关系)
  • 每个答案的百分比(来自特定民意调查的所有答案)

如果每个选项都有答案,我的查询(如下)效果很好,但如果只有一个答案(可能还有3个选项),那么它只会返回一行。

我怎样才能将每个答案都带回一个民意调查,然后是每个答案的答案数量和答案百分比。

SELECT Count(a.choice_id) AS answer_count,
     q.what_to_ask,
     c.id,
     c.choice_text,
     COALESCE (Count(a.choice_id) * 100.0 / NULLIF((SELECT Count(*)
                                                    FROM   answers
                                                    WHERE  poll_id = 2), 0), 0
     ) AS percentage
FROM   choices c
RIGHT OUTER JOIN answers a
            ON a.choice_id = c.id
INNER JOIN polls p ON p.id = a.poll_id
INNER JOIN questions q ON c.question_id = q.id
WHERE  p.id = 2
GROUP  BY c.id, q.what_to_ask, c.choice_text
sql postgresql
1个回答
1
投票

我会改变LEFT JOIN的选择和答案之间的联接:

SELECT Count(a.choice_id) AS answer_count,
     q.what_to_ask,
     c.id,
     c.choice_text,
     COALESCE (Count(a.choice_id) * 100.0 / NULLIF((SELECT Count(*)
                                                    FROM   answers
                                                    WHERE  poll_id = 2), 0), 0
     ) AS percentage
FROM   choices c
LEFT JOIN answers a
            ON a.choice_id = c.id
INNER JOIN polls p ON p.id = a.poll_id
INNER JOIN questions q ON c.question_id = q.id
WHERE  p.id = 2
GROUP  BY c.id, q.what_to_ask, c.choice_text

在使它成为RIGHT JOIN时,您告诉查询仅在答案表中存在匹配时才返回行。

© www.soinside.com 2019 - 2024. All rights reserved.