2017-05-31 4 views
0

Ich bin ziemlich neu in SQL und ich arbeite derzeit an einigen Umfrageergebnissen mit PostgreSQL. Ich muss die Prozentsätze jeder Option aus der 5-Punkte-Skala für alle Umfragefragen berechnen. Ich habe eine Tabelle mit Antwortkennung, Fragekennung, Frageantwortwert. Demografische Informationen, die zum Filtern von Datenschnitten benötigt werden, werden aus einer anderen Tabelle abgerufen. Dann wird die Abfrage an die Ergebnistabelle übergeben. Alle Abfragetexte für bestimmte Datacuts werden vom VBA-Skript generiert.PostgreSQL - Handhabung leeres Abfrageergebnis

Es funktioniert in der Regel OK, aber es gibt einen problematischen Fall - wenn es keine Befragten für bestimmte Schnitt und ich leere Tabelle als Abfrage erhalten Ergebnis. Wenn die Anzahl der Befragten größer als 0 aber niedriger als der Berechnungsschwellenwert ist (5 Befragte), bekomme ich eine Tabelle voller NULL, was in Ordnung ist. Für 0 Befragte bekomme ich 0 Zeilen als Ergebnis und nichts wird an die Ergebnistabelle übergeben und es verursacht eine gewisse Verschiebung in der Final Table. Ich bin in der Lage, solche Schnitte zu verfolgen, da ich auch die Respondent-Nummer für den gesamten Datenschnitt berechne und sie in einer anderen Tabelle ablege. Aber kann ich an dieser Stelle etwas tun - eine Tabelle mit NULLs erzeugen, die bei Bedarf in die Ergebnistabelle eingefügt werden kann?

Vielen Dank im Voraus und Entschuldigung für Ungeschicklichkeit in Code.

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; 

Antwort

0

Wenn Sie, dass die questionid Spalte nicht leer sein, um sicherzustellen wollen, dann usw. Sie müssen einen CTE mit seiner schlichten Werte aufrufen und dann left join mit der Tabelle, die verwenden Sie tatsächlich die Aggregationen machen, calcs So wird es sicher die erste Liste generieren und dann seine Werte verbinden.

Das Beispiel seines Konzeptes wäre so etwas wie:

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

Vielen Dank Julinho für dieses Konzept - es funktioniert für mich :). – japaluis