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