[RAILS] Berechnen Sie den Prozentsatz von "gut", "normal" und "schlecht" im Fragebogen mit SQL

Was du machen willst

Ich möchte herausfinden, wie viel Prozent "gut", "normal" und "schlecht" in den Umfragen enthalten sind. Welche Art von SQL soll ich schreiben?

Datenbeispiel

Inhalt der Umfragetabelle (insgesamt 13 Artikel)

id user_id answer
1 251 War gut
2 113 War gut
3 46 Gewöhnlich
4 414 War gut
5 456 War gut
6 18 Gewöhnlich
7 173 Gewöhnlich
8 441 War gut
9 419 Es war schlecht
10 157 Gewöhnlich
11 116 War gut
12 204 War gut
13 445 Es war schlecht

Wert, den Sie berechnen möchten

Ziel-RDBMS

Antwortbeispiel

Es kann mit solchem SQL berechnet werden.

SELECT
  TO_CHAR(
    100.0 * SUM(CASE WHEN answer = 'War gut' THEN 1 ELSE 0 END) / COUNT(*),
    '999.9%'
  ) AS "War gut",
  TO_CHAR(
    100.0 * SUM(CASE WHEN answer = 'Gewöhnlich'   THEN 1 ELSE 0 END) / COUNT(*),
    '999.9%'
  ) AS "Gewöhnlich",
  TO_CHAR(
    100.0 * SUM(CASE WHEN answer = 'Es war schlecht' THEN 1 ELSE 0 END) / COUNT(*),
    '999.9%'
  ) AS "Es war schlecht"
FROM surveys

Ausgabeergebnis

War gut Gewöhnlich Es war schlecht
1 53.8% 30.8% 15.4%

Kurzer Kommentar

--SUM (FALL WENN Antwort = 'Gut' DANN 1 SONST 0 ENDE) zählt, wie viele" gut "waren. (7 hier) --Zählen Sie die Gesamtzahl der Elemente in der Tabelle mit "COUNT (*)" (13 hier).

Eigentlich laufen

Sie können das Ausführungsergebnis von SQL überprüfen, indem Sie auf die folgende Site zugreifen und auf die Schaltfläche "Ausführen" klicken.

https://rextester.com/XINWIX39774 Screen Shot 2020-10-23 at 10.01.33.png

Bonus: Implementierungsbeispiel in Rails

Wenn Sie es mit Ruby on Rails implementieren, sieht es so aus.

#Schreiben Sie SQL für die SELECT-Klausel
sql = <<~SQL
100.0 * SUM(CASE WHEN answer = 'War gut' THEN 1 ELSE 0 END) / COUNT(*) AS good,
100.0 * SUM(CASE WHEN answer = 'Gewöhnlich'   THEN 1 ELSE 0 END) / COUNT(*) AS fair,
100.0 * SUM(CASE WHEN answer = 'Es war schlecht' THEN 1 ELSE 0 END) / COUNT(*) AS bad
SQL

#Führen Sie SQL aus, um den Wert abzurufen
survey = Survey.select(sql)[0]
survey.good #=> 53.8461538
survey.fair #=> 30.7692308
survey.bad  #=> 15.3846154

Ergänzende Erklärung

――Wenn Sie den Spaltenalias in Japanisch ändern, ist er nicht mit dem Programm kompatibel. Hier ist er also gut / fair / schlecht.

Eine andere Lösung

Aus dem Kommentarbereich dieses Artikels.

Verwenden Sie die AVG-Funktion

SELECT
  TO_CHAR(
    AVG(CASE WHEN answer = 'War gut' THEN 100 ELSE 0 END),
    '999.9%'
  ) AS "War gut",
  TO_CHAR(
    AVG(CASE WHEN answer = 'Gewöhnlich'   THEN 100 ELSE 0 END),
    '999.9%'
  ) AS "Gewöhnlich",
  TO_CHAR(
    AVG(CASE WHEN answer = 'Es war schlecht' THEN 100 ELSE 0 END),
    '999.9%'
  ) AS "Es war schlecht"
FROM surveys;

(Das Ausführungsergebnis ist das gleiche wie im obigen Text)

Berechnen Sie den Durchschnittswert in Zeilenrichtung, nicht in Spaltenrichtung

SELECT
  answer,
  TO_CHAR(
    100.0 * COUNT(*) / (SELECT COUNT(*) FROM surveys),
    '999.9%'
  ) AS "rate"
FROM surveys
GROUP BY answer
ORDER BY rate DESC;

Ausführungsergebnis

answer rate
War gut 53.8%
Gewöhnlich 30.8%
Es war schlecht 15.4%

Recommended Posts

Berechnen Sie den Prozentsatz von "gut", "normal" und "schlecht" im Fragebogen mit SQL
[Für Anfänger] DI ~ Die Grundlagen von DI und DI im Frühjahr ~
Der Vergleich von enum ist == und gleich ist gut [Java]
Erstellen Sie weitere Registerkarten und Fragmente im Fragment von BottomNavigationView
[Rails] Erstellung der zweiten vertikalen Achse und japanische Lokalisierung beim Zeichnen mit amCharts4 usw.
[Java] Ordnen Sie die Daten des vergangenen Montags und Sonntags der Reihe nach an
Betrachten wir die Bedeutung von "Stream" und "Collect" in der Stream-API von Java.
Koexistenz von Flyway in der eingebetteten Datenbank (h2) der Entwicklungsumgebung und der Release-Datenbank (SQL Server) mit Spring Boot