PostgreSQL-Abteilung in Abfrage funktioniert nicht


7

Ich habe also einen wirklich freien Tag oder so, aber für mein Leben kann ich das nicht herausfinden. Ich versuche zu dividieren tier1durch totaleinen Prozentsatz der Gesamtsumme. Ich dachte so:

(tier1 / total) as per

Aber kein Glück. Ich habe diese als int und immer noch nichts CAST. Ich erhalte entweder eine Fehlermeldung und die Abfrage wird nicht ausgeführt, oder ich erhalte den Wert 0.

Folgendes versuche ich zu bearbeiten:

SELECT count(student_id) as total
,(SELECT count(fall_september_tier) FROM national_assessments.aimsweb WHERE general_outcome_measure = 'PSF' AND fall_september_tier = 1) as tier1
,(SELECT count(fall_september_tier) FROM national_assessments.aimsweb WHERE general_outcome_measure = 'PSF' AND fall_september_tier = 2) as tier2
,(SELECT count(fall_september_tier) FROM national_assessments.aimsweb WHERE general_outcome_measure = 'PSF' AND fall_september_tier = 3) as tier3
FROM national_assessments.aimsweb
WHERE general_outcome_measure = 'PSF' AND fall_september_tier IS NOT NULL

Ich hatte auch diese Idee, aber kein Glück:

SELECT tier1,total, tier1/total as test
FROM (
    SELECT count(student_id) as total
    ,(SELECT count(fall_september_tier) FROM national_assessments.aimsweb WHERE general_outcome_measure = 'PSF' AND fall_september_tier = 1) as tier1
    ,(SELECT count(fall_september_tier) FROM national_assessments.aimsweb WHERE general_outcome_measure = 'PSF' AND fall_september_tier = 2) as tier2
    ,(SELECT count(fall_september_tier) FROM national_assessments.aimsweb WHERE general_outcome_measure = 'PSF' AND fall_september_tier = 3) as tier3
    FROM national_assessments.aimsweb
    WHERE general_outcome_measure = 'PSF' AND fall_september_tier IS NOT NULL
) as test

Antworten:


11

Die Ganzzahldivision schneidet Bruchziffern ab. Ihr Ausdruck gibt ein Verhältnis zwischen 0 und 1 zurück, das immer auf 0 gekürzt wird.

Um "Prozentsatz" zu erhalten, multiplizieren Sie zuerst mit 100.
Um auch gebrochene Ziffern zu erhalten, setzen Sie auf numeric(bevor Sie teilen) - oder multiplizieren Sie mit 100.0. Das Vorhandensein einer gebrochenen Ziffer im numerischen Literal zwingt das Ergebnis numericautomatisch.

Normalerweise runden Sie auf zwei Bruchstellen oder so. Verwenden Sie round()dafür (funktioniert nur für numeric).

Hinzufügen einiger weiterer grundlegender Optimierungen zu der Abfrage, die Sie erhalten:

SELECT total
      ,tier1, round((tier1 * 100.0) / total, 2) AS tier1_pct
      ,tier2, round((tier2 * 100.0) / total, 2) AS tier2_pct
      ,tier3, round((tier3 * 100.0) / total, 2) AS tier3_pct
FROM  (
   SELECT count(*) AS total
         ,count(fall_september_tier = 1 OR NULL) AS tier1
         ,count(fall_september_tier = 2 OR NULL) AS tier2
         ,count(fall_september_tier = 3 OR NULL) AS tier3
   FROM   national_assessments.aimsweb
   WHERE  general_outcome_measure = 'PSF'
   AND    fall_september_tier IS NOT NULL
   ) sub;

Erklärung für die Zähltechnik:

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.