2017-05-31 115 views
0

我對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; 

回答

0

如果你想確保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