valores - what is mysql




soma de count(*) para todas as linhas no MySQL (6)

Adicione um group by cláusula no final para user-type , por exemplo:

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;

Eu estou preso com a consulta sum() onde eu quero a soma dos valores count(*) em todas as linhas com o group by .

Aqui está a consulta:

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;

Saída atual:

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

Saída esperada:

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

Se eu remover sum(u.count) da consulta, a saída será semelhante a:

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

Eu ficaria tentado a perguntar; Tem certeza de que precisa disso no nível do banco de dados?

A menos que você esteja trabalhando apenas na camada de banco de dados, qualquer processamento desses resultados será incorporado a uma camada de aplicativo e presumivelmente exigirá alguma forma de loop pelos resultados.

Poderia ser mais fácil, mais simples e mais legível de ser executado

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

.. e simplesmente soma a contagem total na camada de aplicação

Como apontado por Juan em outra resposta, o DISTINCT é redundante, pois o GROUP BY garante que cada linha resultante seja diferente.

Como Juan, eu também prefiro um IN aqui, em vez de uma condição OR, para o user_type, pois acho mais legível. Também reduz o risco de confusão se combinar outras condições AND no futuro

Como um aparte, eu consideraria mover os nomes dos tipos de usuário, "driver" e "passageiro" para uma tabela user_types separada e referenciá-los por uma coluna de ID da sua tabela de usuários

NB Se você realmente precisa disso no nível de banco de dados, eu defendo usar uma das excelentes opções de Paul, ou a abordagem CROSS JOIN oferecida por Tom Mac, e por Juan como sua segunda solução sugerida.


Tente isto:

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);

Eu usei o dialeto postgresql, mas você pode facilmente mudar para uma subconsulta.


Você pode usar o modificador 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

Isso retornará as mesmas informações, mas em um formato diferente:

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

db-fiddle

No MySQL 8 você pode usar COUNT() como função de janela :

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

Resultado:

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

db-fiddle

ou use 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


Você precisa de uma subconsulta:

   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 ; 

Note que você não precisa distinct aqui.

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 ; 

Tom Mac Explicar corretamente Sua resposta. Aqui está a outra maneira de fazer isso. Eu verifico o desempenho da consulta e não encontrei nenhuma diferença dentro de 1000 registros

   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