我是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;
答案 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