sum of count(*) pour toutes les lignes de MySQL




database rdbms (6)

Ajoutez une clause group by à la fin pour user-type , par exemple:

select
    u.user_type as user,
    u.count,
    sum(u.count)
FROM
(
select 
    DISTINCT
    user_type,
    count(*) as count
FROM
    users
where
    (user_type = "driver" OR user_type = "passenger")
GROUP BY
    user_type
) u GROUP BY u.user_type;

Je suis coincé avec la requête sum() où je veux la somme des valeurs count(*) dans toutes les lignes avec group by .

Voici la requête:

select
    u.user_type as user,
    u.count,
    sum(u.count)
FROM
(
select 
    DISTINCT
    user_type,
    count(*) as count
FROM
    users
where
    (user_type = "driver" OR user_type = "passenger")
GROUP BY
    user_type
) u;

Sortie de courant:

----------------------------------
|  user     |  count     |  sum  |
----------------------------------
| driver    | 58         |  90   |
----------------------------------

Production attendue:

----------------------------------
|  user     |  count     |  sum  |
----------------------------------
| driver    | 58         |  90   |
| passenger | 32         |  90   |
----------------------------------

Si je supprime sum(u.count) de la requête, le résultat est le suivant:

--------------------------
|  user     |  count     |
--------------------------
| driver    | 58         |
| passenger | 32         |
--------------------------

Essaye ça. La vue en ligne obtient le total général:

SELECT a.user_type, 
       count(*) AS count,
       b.sum  
FROM   users a
JOIN (SELECT COUNT(*) as sum 
      FROM users 
      WHERE user_type IN ("driver","passenger" )
     ) b ON TRUE
WHERE  a.user_type IN ("driver","passenger" ) 
GROUP  BY a.user_type;

Je serais tenté de demander; Êtes-vous certain d’avoir besoin de cela au niveau de la base de données?

Sauf si vous travaillez uniquement dans la couche base de données, tout traitement de ces résultats sera intégré à une couche application et nécessitera probablement une certaine forme de boucle dans les résultats.

Il pourrait être plus facile, plus simple et plus lisible à exécuter

  SELECT user_type,
         COUNT(*) AS count
    FROM users
   WHERE user_type IN ("driver", "passenger")
GROUP BY user_type

.. et additionnez simplement le nombre total dans la couche d'application

Comme Juan l'a souligné dans une autre réponse, DISTINCT est redondant car GROUP BY garantit que chaque ligne résultante est différente.

Comme Juan, je préfère également une condition IN ici plutôt que la condition OR pour le type_utilisateur, car je la trouve plus lisible. Cela réduit également le risque de confusion en combinant d'autres conditions ET à l'avenir.

En passant, j’envisagerais de déplacer les noms des types d’utilisateurs, "conducteur" et "passager" dans une table distincte user_types et de les référencer par une colonne ID de la table des utilisateurs

NB: Si vous en avez absolument besoin au niveau des PD, je vous recommanderais d'utiliser l'une des excellentes options de Paul ou l'approche CROSS JOIN proposée par Tom Mac et par Juan comme deuxième solution suggérée.


Vous avez besoin d'une sous-requête:

   SELECT user_type, 
          Count(*) AS count,
          (SELECT COUNT(*) 
           FROM users 
           WHERE user_type IN ("driver","passenger" )) as sum  
   FROM   users 
   WHERE  user_type IN ("driver","passenger" ) 
   GROUP  BY user_type ; 

Notez que vous n'avez pas besoin de distinct ici.

OU

   SELECT user_type, 
          Count(*) AS count,
          c.sum
   FROM   users 
   CROSS JOIN ( 
           SELECT COUNT(*) as sum
           FROM users 
           WHERE user_type IN ("driver","passenger" )
         ) as c

   WHERE  user_type IN ("driver","passenger" ) 
   GROUP  BY user_type ; 

Vous pouvez utiliser le modificateur WITH ROLLUP :

select coalesce(user_type, 'total') as user, count(*) as count
from users
where user_type in ('driver', 'passenger')
group by user_type with rollup

Cela retournera la même information mais dans un format différent:

user      | count
----------|------
driver    |    32
passenger |    58
total     |    90

db-fiddle

Dans MySQL 8, vous pouvez utiliser COUNT() comme fonction de fenêtre :

select distinct
  user_type,
  count(*) over (partition by user_type) as count,
  count(*) over () as sum
from users
where user_type in ('driver', 'passenger');

Résultat:

user_type | count | sum
----------|-------|----
driver    |    32 |  90
passenger |    58 |  90

db-fiddle

ou utilisez CTE (Common Table Expressions) :

with cte as (
  select user_type, count(*) as count
  from users
  where user_type in ('driver', 'passenger')
  group by user_type
)
select user_type, count, (select sum(count) from cte) as sum
from cte

db-fiddle


Tom Mac Expliquez correctement votre réponse. Voici une autre façon de faire cela. Je vérifie les performances de la requête et ne trouve aucune différence sur 1000 enregistrements

   select user_type,Countuser,(SELECT COUNT(*) 
   FROM users 
   WHERE user_type IN ('driver','passenger ') )as sum from (
   select user_type,count(*) as Countuser from users a
   where a.user_type='driver'
   group by a.user_type
   union
   select user_type,count(*) as Countuser from users b
   where b.user_type='passenger'
   group by b.user_type
   )c
   group by user_type,Countuser




rdbms