在Array中排序并将null或0设为缺失值

时间:2017-12-12 07:48:36

标签: sql postgresql

由于缺少值或空值,我在数组内部进行排序存在问题。

我的代码

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)并显示每个问题的数组分数。

2 个答案:

答案 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