sourcecode

동일한 select 문장에서 count 및 group by를 사용하는 방법

codebag 2023. 4. 18. 22:37
반응형

동일한 select 문장에서 count 및 group by를 사용하는 방법

SQL이 있습니다.SELECT또한 를 사용하는 쿼리GROUP BY, 모든 레코드를 카운트하고 싶다.GROUP BY절이 결과 세트를 필터링했습니다.

SQL에서 직접 이 작업을 수행할 수 있는 방법이 있습니까?예를 들어 테이블이 있는 경우users다른 마을과 총 사용자 수를 선택합니다.

SELECT `town`, COUNT(*)
FROM `user`
GROUP BY  `town`;

모든 마을이 있는 칼럼과 모든 줄의 사용자 수가 있는 칼럼을 만들고 싶습니다.

3개의 타운과 총 58명의 사용자가 있는 경우의 결과는 다음과 같습니다.

도시 세어보세요
코펜하겐 58
뉴욕 58
아테네 58

이것은 당신이 원하는 것을 할 수 있습니다(마을 목록, 각각의 사용자 수).

SELECT `town`, COUNT(`town`)
FROM `user`
GROUP BY `town`;

대부분의 집약 함수를 사용할 수 있습니다.GROUP BY스테이트먼트(COUNT,MAX,COUNT DISTINCT등)

업데이트: 사용자 수에 대한 변수를 선언하고 결과를 저장할 수 있습니다.SELECT변수 값:

DECLARE @numOfUsers INT
SET @numOfUsers = SELECT COUNT(*) FROM `user`;

SELECT DISTINCT `town`, @numOfUsers FROM `user`;

다음을 사용할 수 있습니다.

SELECT COUNT(DISTINCT town) 
FROM user

또 다른 방법은 다음과 같습니다.

/* Number of rows in a derived table called d1. */
select count(*) from
(
  /* Number of times each town appears in user. */
  select town, count(*)
  from user
  group by town
) d1

삭제되지 않은 답변 10개.대부분은 사용자가 요구한 대로 하지 않습니다.대부분의 응답자가 질문을 잘못 이해한 것은 각 도시에 58명의 사용자가 있다고 생각했기 때문입니다.총 58명이 아닌 58명이 아닙니다.심지어 정답인 몇 명도 최적이 아니다.

mysql> flush status;
Query OK, 0 rows affected (0.00 sec)

SELECT  province, total_cities
    FROM       ( SELECT  DISTINCT province  FROM  canada ) AS provinces
    CROSS JOIN ( SELECT  COUNT(*) total_cities  FROM  canada ) AS tot;
+---------------------------+--------------+
| province                  | total_cities |
+---------------------------+--------------+
| Alberta                   |         5484 |
| British Columbia          |         5484 |
| Manitoba                  |         5484 |
| New Brunswick             |         5484 |
| Newfoundland and Labrador |         5484 |
| Northwest Territories     |         5484 |
| Nova Scotia               |         5484 |
| Nunavut                   |         5484 |
| Ontario                   |         5484 |
| Prince Edward Island      |         5484 |
| Quebec                    |         5484 |
| Saskatchewan              |         5484 |
| Yukon                     |         5484 |
+---------------------------+--------------+
13 rows in set (0.01 sec)

SHOW session status LIKE 'Handler%';

+----------------------------+-------+
| Variable_name              | Value |
+----------------------------+-------+
| Handler_commit             | 1     |
| Handler_delete             | 0     |
| Handler_discover           | 0     |
| Handler_external_lock      | 4     |
| Handler_mrr_init           | 0     |
| Handler_prepare            | 0     |
| Handler_read_first         | 3     |
| Handler_read_key           | 16    |
| Handler_read_last          | 1     |
| Handler_read_next          | 5484  |  -- One table scan to get COUNT(*)
| Handler_read_prev          | 0     |
| Handler_read_rnd           | 0     |
| Handler_read_rnd_next      | 15    |
| Handler_rollback           | 0     |
| Handler_savepoint          | 0     |
| Handler_savepoint_rollback | 0     |
| Handler_update             | 0     |
| Handler_write              | 14    |  -- leapfrog through index to find provinces  
+----------------------------+-------+

OP의 경우:

SELECT  town, total_users
    FROM       ( SELECT  DISTINCT town  FROM  canada ) AS towns
    CROSS JOIN ( SELECT  COUNT(*) total_users  FROM  canada ) AS tot;

한 줄밖에 없기 때문에tot,그CROSS JOIN다른 방법보다 부피가 크지 않습니다.

통상적인 패턴은COUNT(*)대신COUNT(town)후자는 확인을 의미합니다.townnull이 아닌 경우, 이 컨텍스트에서는 불필요합니다.

Oracle에서는 다음과 같은 분석 기능을 사용할 수 있습니다.

select town, count(town), sum(count(town)) over () total_count from user
group by town

다른 옵션은 다음과 같은 서브쿼리를 사용하는 것입니다.

select town, count(town), (select count(town) from user) as total_count from user
group by town

카운트로 주문하는 경우(간단하게 들리지만, 그 방법의 스택에서 답을 찾을 수 없습니다) 다음을 수행할 수 있습니다.

        SELECT town, count(town) as total FROM user
        GROUP BY town ORDER BY total DESC

Milkovsky가 말한 것처럼 Count 안에 DISTINT를 사용할 수 있습니다.

내 경우:

select COUNT(distinct user_id) from answers_votes where answer_id in (694,695);

이렇게 하면 하나의 카운트와 동일한 user_id로 간주되는 응답 투표의 카운트가 꺼집니다.

SQL Server의 오래된 게시물인 것을 알고 있습니다.

select  isnull(town,'TOTAL') Town, count(*) cnt
from    user
group by town WITH ROLLUP

Town         cnt
Copenhagen   58
NewYork      58
Athens       58
TOTAL        174

타운 및 총 사용자 수를 선택하려면 아래 쿼리를 사용할 수 있습니다.

SELECT Town, (SELECT Count(*) FROM User) `Count` FROM user GROUP BY Town;

[ Select All Query With Count ]옵션을 사용하려면 다음 절차를 수행합니다.

 select a.*, (Select count(b.name) from table_name as b where Condition) as totCount from table_name  as a where where Condition

다음 코드를 사용해 보십시오.

select ccode, count(empno) 
from company_details 
group by ccode;

언급URL : https://stackoverflow.com/questions/2722408/how-to-use-count-and-group-by-at-the-same-select-statement

반응형