PostgreSQL - 处理空查询结果

时间:2017-05-31 01:11:49

标签: sql postgresql

我是SQL的新手,我目前正在使用PostgreSQL进行一些调查结果。对于所有调查问题,我需要从5分制计算每个选项的百分比。我有一个表格,其中包含respondentid,questionid,问题响应值。从另一个表中检索过滤datacut所需的人口统计信息。然后将查询传递给结果表。特定数据库的所有查询文本都由VBA脚本生成。

一般情况下运行正常,但是有一个有问题的情况 - 当没有特定剪切的受访者时,我收到空表作为查询结果。如果响应者计数大于0但低于计算阈值(5个响应者)我得到的表充满了NULL,这是可以的。对于0个受访者,我得到0行作为结果,没有任何内容传递给结果表,并且它导致最终表中的一些位移。我能够跟踪这样的削减,因为我还计算整体数据的响应数并将其存储在另一个表中。但是在这一点上我能做些什么 - 生成一些满是NULL的表,可以在需要时插入到结果表中?

提前致谢并对代码中的笨拙感到抱歉。

WITH ItemScores AS (
SELECT
    rsp.questionid,
    CASE WHEN SUM(CASE WHEN rsp.respvalue >= 0 THEN 1 ELSE 0 END) < 5 THEN 
NULL 
ELSE
    ROUND(SUM(CASE WHEN rsp.respvalue = 5 THEN 1 ELSE 0 END)/CAST(SUM(CASE 
    WHEN rsp.respvalue >= 0 THEN 1 ELSE 0 END) AS DECIMAL),2)
END AS 5spercentage,

... and so on for frequencies of 1s,2s,3s and 4s

SUM(CASE WHEN rsp.respvalue >= 0 THEN 1 ELSE 0 END) AS QuestionTotalAnswers

FROM (
    some filtering applied here [...]
     ) AS rsp

GROUP BY rsp.questionid
ORDER BY rsp.questionid;
INSERT INTO results_items SELECT * from ItemScores;

1 个答案:

答案 0 :(得分:0)

如果您想确保questionid列不会为空,那么您必须使用其纯值调用cte,然后使用您实际使用的表调用left join制作聚合,计算等。因此,它将确保生成第一个列表,然后加入其值。

其概念的例子如下:

with calcs as (
select questionid, sum(respvalue) as sum_per_question
from rsp
group by questionid)

select distinct rsp.questionid, calcs.sum_per_question
from rsp
left join calcs on rsp.questionid = calcs.questionid