MySQL의 모든 행에 대한 개수(*) 합계




database rdbms (6)

나는 sum() 쿼리를 사용하여 group by 모든 행에서 count(*) 합계를 원한다.

다음은 쿼리입니다.

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;

전류 출력 :

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

예상 출력 :

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

쿼리에서 sum(u.count) 을 제거하면 출력은 다음과 같습니다.

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

나는 묻고 싶다. DB 수준에서이 기능이 필요합니까?

순전히 데이터베이스 계층에서 작업하지 않는 한, 이러한 결과의 처리는 응용 프로그램 계층에 구축되며 결과를 통해 반복적 인 루핑이 필요할 것입니다

더 쉽고 간단하며 더 읽기 쉽도록 실행할 수 있습니다.

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

.. 그리고 단순히 응용 프로그램 계층에서 총 개수를 더하십시오

Juan이 다른 대답에서 지적한 것처럼 DISTINCT는 GROUP BY가 각 결과 행이 서로 다르도록 보장하므로 중복됩니다.

Juan과 마찬가지로 user_type은 OR 조건보다 IN을 더 선호합니다. 또한 앞으로 AND 조건을 추가 할 경우 혼란의 가능성을 줄입니다.

제쳐두고 사용자 유형 "driver"와 "passenger"의 이름을 별도의 user_types 테이블로 이동하고 users 테이블의 ID 열에 의해 참조하는 것을 고려할 것입니다

주의 DB 레벨에서 절대적으로 이것을 필요로한다면 나는 Paul의 우수한 옵션 중 하나를 사용하거나 Tom Mac이 제공하는 CROSS JOIN 접근법을 사용하고 Juan은 그의 두 번째 제안 솔루션을 사용하도록 권유합니다


마지막에 user-type 위한 group by 절을 추가하십시오. 예 :

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;

이 시도:

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

postgresql dialect를 사용했지만 서브 쿼리로 쉽게 변경할 수 있습니다.


하위 쿼리가 필요합니다.

   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 ; 

여기서는 distinct 필요하지 않습니다.

또는

   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 ; 

SUM() OVER()COUNT(*) 간단히 결합 할 수 있습니다.

SELECT user_type, COUNT(*) AS cnt, SUM(COUNT(*)) OVER() AS total
FROM  users WHERE user_type IN ('driver', 'passenger') GROUP BY user_type;

db <> 바이올린 데모

산출:

+------------+------+-------+
| user_type  | cnt  | total |
+------------+------+-------+
| passenger  |  58  |    90 |
| driver     |  32  |    90 |
+------------+------+-------+

Tom Mac 귀하의 대답을 올바르게 설명하십시오. 여기 당신이 할 수있는 또 다른 방법이 있습니다. 쿼리 성능을 확인하고 1000 레코드 내에서 차이를 발견하지 못했습니다.

   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