mysql - differenze - sql type of data




somma del conteggio(*) per tutte le righe in MySQL (6)

Aggiungi un group by clausola alla fine per user-type , ad esempio:

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;

Sono bloccato con sum() query in cui voglio la somma dei valori count(*) in tutte le righe con group by .

Ecco la query:

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;

Uscita corrente:

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

Uscita prevista:

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

Se rimuovo sum(u.count) dalla query, l'output è simile a:

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

Hai bisogno di una sottoquery:

   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 ; 

Nota che non è necessario essere distinct qui.

O

   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 ; 

Prova questo. La vista incorporata ottiene il totale complessivo:

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;

Prova questo:

WITH SUB_Q AS (
  SELECT USER_TYPE, COUNT (*) AS CNT
  FROM USERS
  WHERE USER_TYPE = "passenger" OR USER_TYPE = "driver"
  GROUP BY USER_TYPE
), 
SUB_Q2 AS (
  SELECT SUM(CNT) AS SUM_OF_COUNT
  FROM SUB_Q
)
SELECT A.USER_TYPE, A.CNT AS COUNT, SUB_Q2 AS SUM
FROM SUB_Q JOIN SUB_Q2 ON (TRUE);

Ho usato il dialetto postgresql ma puoi facilmente passare a una sottoquery.


Sarei tentato di chiedere; Sei sicuro di averne bisogno a livello di DB?

A meno che non si stia lavorando esclusivamente nel livello del database, qualsiasi elaborazione di questi risultati sarà incorporata in un livello applicativo e presumibilmente richiederà una qualche forma di collegamento ciclico tra i risultati

Potrebbe essere più facile, più semplice e più leggibile da eseguire

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

.. e semplicemente sommare il conteggio totale nel livello applicazione

Come sottolineato da Juan in un'altra risposta, DISTINCT è ridondante poiché GROUP BY assicura che ogni riga risultante sia diversa

Come Juan, preferisco anche un IN qui, piuttosto che una condizione OR, per il tipo_utente in quanto lo trovo più leggibile. Riduce anche il rischio di confusione se si combinano ulteriori condizioni AND in futuro

Per inciso, vorrei prendere in considerazione la possibilità di spostare i nomi dei tipi di utente, "driver" e "passeggero" in una tabella user_types separata e farvi riferimento da una colonna ID dalla tabella degli utenti

NB Se ne hai assolutamente bisogno a livello di DB, vorrei sostenere l'utilizzo di una delle eccellenti opzioni di Paul, o l'approccio CROSS JOIN offerto da Tom Mac, e da Juan come la sua seconda soluzione suggerita


Tom Mac spiega correttamente la tua risposta. Ecco l'altro modo in cui puoi farlo. Controllo le prestazioni della query e non ho trovato alcuna differenza entro 1000 record

   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