동일한 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)
후자는 확인을 의미합니다.town
null이 아닌 경우, 이 컨텍스트에서는 불필요합니다.
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
'sourcecode' 카테고리의 다른 글
Bash에서 두 변수 빼기 (0) | 2023.04.18 |
---|---|
다른 git 저장소에서 cherry-pick이 가능합니까? (0) | 2023.04.18 |
DataGrid WPF에서 선택한 행 항목 가져오기 (0) | 2023.04.18 |
ID 컬럼을 사용한 테이블 작성 방법 (0) | 2023.04.18 |
C#에서 FindTimeZoneById()와 함께 사용하는 시간대 ID 목록? (0) | 2023.04.18 |