PostgreSQL - 处理空的查询结果

问题描述:

我对SQL很陌生,目前我正在使用PostgreSQL来处理一些调查结果。我需要从所有调查问题的5分制中计算每个选项的百分比。我有一个respondentid,questionid,问题响应值的表。过滤datacut所需的人口统计信息从另一个表中检索。然后查询被传递给结果表。所有针对特定datacut的查询文本都是由VBA脚本生成的。PostgreSQL - 处理空的查询结果

它的工作原理一般,但有一个问题的情况 - 当没有受访者为特定剪切,我收到空表作为查询结果。如果受访者数量大于0但低于计算阈值(5个受访者),则表中填满了NULL,这是可以的。对于0名受访者,我得到0行作为结果,没有任何内容传递给结果表,并且它在决赛桌中导致一些位移。我能够跟踪这种削减,因为我也在计算整个datacut的受访者数量并将其存储在另一个表中。但是在这一点上我能做些什么 - 生成某种充满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; 

如果你想确保questionid栏不会是空的,那么你就必须调用CTE以其纯值,然后left join与实际使用的是使聚合,Calcs(计算)等表所以它会确定第一个列表,然后加入它的值。

其概念的例子是这样的:

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 
+0

感谢这个概念很多Julinho - 它为我工作:)。 – japaluis