由于缺少值或空值,我在数组内部进行排序存在问题。
我的代码
SELECT
submission_id,
ARRAY_AGG(question_score) as questions_scores,
SUM(question_score) as groupe_score
FROM(
SELECT
sa.submission_id,
qq.id as question_id,
CASE WHEN SUM(qo.answer_points) > MAX(qq.max_answer_points) THEN MAX(qq.max_answer_points) ELSE SUM(qo.answer_points) END as question_score
FROM selection_answers sa
inner join question_options qo on qo.id = sa.question_option_id
inner join questions qq on qq.id = qo.question_id
WHERE qq.task_form_id = 3306 GROUP BY 1,2 ORDER BY sa.submission_id ASC, qq.id ASC ) AS t1 GROUP BY 1
输出:
submission_id | questions_scores | groupe_score
-------------------------------------------------------------------
1034543 | {0,0,0,10,0,10,0,5,0,0,0,5,0,0,0} | 30
1034562 | {0,15,15,5,10,0,10,0,5,0,10,10,5,0,0} | 85
1034645 | {0,0,10,0,10,0,5,0,10,10,5,0,0} | 50
1034699 | {0,0,0,15,5,10,0,10,0,5,0,0,10,10,5,0,0,0} | 70
我在同一个qq.id顺序中的questions_scores中需要相同数量的输出。我尝试过左侧和完全外部连接,但找不到方法。我还创建了一个带有问题表的CTE,并尝试加入此表和CTE中的每一行,但无法弄明白。谢谢你的帮助!
-------编辑表格详情----
问题表栏:
id | max_answer_points
question_options表格列:
id | question_id | answer_points
selection_answer表格列:
id| submission_id| question_option_id
当提交的提交可以在selected_answers中选择多个选项,或者由于与先前所选问题的结果相关的逻辑而跳过问题,因此可能没有答案。我的目标是显示按提交分组的SUM(answer_points)并显示每个问题的数组分数。
答案 0 :(得分:1)
我已经解决了。我选择了两次问题表,然后将selection_answers和question_options加入其中一个。这是代码:
SELECT
submission_id,
ARRAY_AGG(question_score) as question_scores,
SUM(question_score) as total_score
FROM(
SELECT
submission_id, qq_id,
SUM(CASE WHEN qq_id=xx_id THEN question_score ELSE 0 END) AS question_score
FROM (
SELECT
qq.id as qq_id,
xx.id as xx_id,
sa.submission_id,
CASE WHEN SUM(qo.answer_points) > MAX(xx.max_answer_points) THEN MAX(xx.max_answer_points) ELSE SUM(qo.answer_points) END as question_score
FROM questions qq, questions xx
left join question_options qo on qo.question_id = xx.id
left join selection_answers sa on sa.question_option_id = qo.id
left join task_forms tf on tf.id = xx.task_form_id
WHERE qq.task_form_id=3306 AND xx.task_form_id=3306
GROUP BY 1,2,3 ORDER BY sa.submission_id ASC, qq.position ASC, xx.position ASC ) AS t1 GROUP BY 1,2 ORDER BY 1 ASC, 2 ASC ) AS t2
GROUP BY 1
答案 1 :(得分:0)
如果我理解正确,您希望每个questions
和每个submission_answers
都有一个结果,无论是否匹配question_options
。
在这种情况下,您应该像这样加入:
FROM (submission_answers sa
CROSS JOIN questions qq)
LEFT JOIN question_options qo
ON qo.id = sa.question_option_id AND qo.question_id = qq.id
您必须处理查询中的NULL值。
要在数组中获得正确的顺序,请使用
array_agg(question_score ORDER BY qq.id) as questions_scores