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
感谢这个概念很多Julinho - 它为我工作:)。 – japaluis