[RAILS] Calculez le pourcentage de "bon", "normal" et "mauvais" dans le questionnaire à l'aide de SQL

Chose que tu veux faire

J'aimerais connaître le pourcentage de «bons», «normaux» et «mauvais» inclus dans les enquêtes. Quel type de SQL dois-je écrire?

Exemple de données

Contenu du tableau des enquêtes (13 éléments au total)

id user_id answer
1 251 C'était bien
2 113 C'était bien
3 46 habituellement
4 414 C'était bien
5 456 C'était bien
6 18 habituellement
7 173 habituellement
8 441 C'était bien
9 419 C'était mauvais
10 157 habituellement
11 116 C'était bien
12 204 C'était bien
13 445 C'était mauvais

Valeur que vous souhaitez calculer

--Bon = 53,8% (car il y en a 7)

SGBDR cible

Exemple de réponse

Il peut être calculé avec un tel SQL.

SELECT
  TO_CHAR(
    100.0 * SUM(CASE WHEN answer = 'C'était bien' THEN 1 ELSE 0 END) / COUNT(*),
    '999.9%'
  ) AS "C'était bien",
  TO_CHAR(
    100.0 * SUM(CASE WHEN answer = 'habituellement'   THEN 1 ELSE 0 END) / COUNT(*),
    '999.9%'
  ) AS "habituellement",
  TO_CHAR(
    100.0 * SUM(CASE WHEN answer = 'C'était mauvais' THEN 1 ELSE 0 END) / COUNT(*),
    '999.9%'
  ) AS "C'était mauvais"
FROM surveys

Résultat de sortie

C'était bien habituellement C'était mauvais
1 53.8% 30.8% 15.4%

Bref commentaire

--SUM (CASE WHEN answer = 'Good' THEN 1 ELSE 0 END) compte combien de" bons "étaient. (7 ici)

En fait courir

Vous pouvez vérifier le résultat de l'exécution de SQL en accédant au site suivant et en cliquant sur le bouton "Exécuter".

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

Bonus: exemple d'implémentation dans Rails

Si vous l'implémentez avec Ruby on Rails, cela ressemble à ceci.

#Ecrire une clause SQL pour SELECT
sql = <<~SQL
100.0 * SUM(CASE WHEN answer = 'C'était bien' THEN 1 ELSE 0 END) / COUNT(*) AS good,
100.0 * SUM(CASE WHEN answer = 'habituellement'   THEN 1 ELSE 0 END) / COUNT(*) AS fair,
100.0 * SUM(CASE WHEN answer = 'C'était mauvais' THEN 1 ELSE 0 END) / COUNT(*) AS bad
SQL

#Exécutez SQL pour obtenir la valeur
survey = Survey.select(sql)[0]
survey.good #=> 53.8461538
survey.fair #=> 30.7692308
survey.bad  #=> 15.3846154

Explication supplémentaire

――Si vous changez l'alias de colonne en japonais, il ne sera pas compatible avec le programme, donc ici c'est bon / passable / mauvais.

Une autre solution

De la section commentaires de cet article.

Utiliser la fonction AVG

SELECT
  TO_CHAR(
    AVG(CASE WHEN answer = 'C'était bien' THEN 100 ELSE 0 END),
    '999.9%'
  ) AS "C'était bien",
  TO_CHAR(
    AVG(CASE WHEN answer = 'habituellement'   THEN 100 ELSE 0 END),
    '999.9%'
  ) AS "habituellement",
  TO_CHAR(
    AVG(CASE WHEN answer = 'C'était mauvais' THEN 100 ELSE 0 END),
    '999.9%'
  ) AS "C'était mauvais"
FROM surveys;

(Le résultat de l'exécution est le même que le texte ci-dessus)

Calculez la valeur moyenne dans le sens de la ligne, pas dans le sens de la colonne

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

Résultat d'exécution

answer rate
C'était bien 53.8%
habituellement 30.8%
C'était mauvais 15.4%

Recommended Posts

Calculez le pourcentage de "bon", "normal" et "mauvais" dans le questionnaire à l'aide de SQL
[Pour les débutants] DI ~ Les bases de DI et DI au printemps ~
La comparaison d'énumération est ==, et equals est bonne [Java]
Créer plus d'onglets et de fragments dans le fragment de BottomNavigationView
[Rails] Création du deuxième axe vertical et localisation japonaise dans le dessin graphique à l'aide d'amCharts4, etc.
[Java] Obtenez les dates des derniers lundi et dimanche dans l'ordre
Examinons la signification de "stream" et "collect" dans l'API Stream de Java.
Coexistence de Flyway dans la base de données embarquée (h2) de l'environnement de développement et la base de données des versions (SQL Server) avec Spring Boot