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


223

그룹별로 SQL 선택 쿼리가 있습니다. 그룹 별 명세서 다음의 모든 레코드를 계산하고 싶습니다. SQL에서 직접이 방법이 있습니까? 예를 들어, 사용자가있는 테이블이 있으면 다른 도시와 사용자 수 를 선택하고 싶습니다.

select town, count(*) from user
group by town

모든 도시의 열과 모든 행의 사용자 수를 가진 열을 갖고 싶습니다.

3 개의 도시와 58 명의 사용자가있는 결과의 예는 다음과 같습니다.

Town         Count
Copenhagen   58
NewYork      58
Athens       58

당신은 당신의 결과 집합이 도시와 사용자를 위해 각각 2 카운트를 갖기를 원하십니까?
Leslie

2
따라서 각 도시마다 하나의 행을 원하고 각 행에서 2 열에는 모든 사용자의 총 수가 포함됩니까? 따라서 열 2는 각 행에 대해 동일한 값을 가지고 있습니까? 샘플 데이터와 필수 출력을 포함하도록 편집하면 원하는 것을 정확하게 제공 할 수 있습니다.
AakashM

당신이 맞습니다 AakashM! 방금 편집했습니다.
Stavros


1
독자에 대한 경고 : 대부분의 답변은 업데이트 된 쿼리에 대한 답변을 제공하지 못합니다.
Rick James

답변:


271

이것은 당신이 원하는 것을 할 것입니다 (각 도시의 사용자 수를 가진 도시 목록) :

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

를 사용할 때 대부분의 집계 함수를 사용할 수 있습니다 GROUP BY.

업데이트 (질문 및 의견 변경 후)

사용자 수에 대한 변수를 선언하고 사용자 수로 설정 한 다음이를 사용하여 선택할 수 있습니다.

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

SELECT DISTINCT town, @numOfUsers
FROM user

그게 정확히 OP가 쓴 것입니까? NVM, 난, 당신이있는 거 계산 타운하지 * .... 당신의 차이를 볼
레슬리

@Leslie-두 쿼리간에 차이가 없습니다. 동일한 결과 집합을 반환합니다. 난 그냥의 사용을 싫어하는 *영업 이익은 자신의 질문에 대답 ...하지만, 난 그냥 올바른 :) 것을 검증하고 심지어 시험 그것에 보이지 않았다 fredosaurus.com/notes-db/select/groupby.html
오디드를

다시 한 번 내가 바라던 것은 아니지만 이것이 최선의 해결책 인 것 같습니다.;) 감사합니다
Stavros

149

당신은 사용할 수 있습니다 COUNT(DISTINCT ...):

SELECT COUNT(DISTINCT town) 
FROM user

3
매력으로 작동합니다 ... 주요 답변을 선택해야합니다 .. 이것이 좋지 않은 프로브를 제외하고.
빅터

2
WHERE 절에 COUNT (DISTINCT town)을 넣으면 의미가 있다고 생각합니다. 집계 함수이므로 HAVING 절에 제공해야하기 때문입니다. COUNT 및 DISTINCT 키워드로 인해 SELECT COUNT (DISTINCT town)가 암시 적 GROUP BY로 바뀔 때이 SQL 쿼리가 잘못되었습니다. 각 키워드는 자체적으로 암시 적으로 그룹화됩니다.
A. Greensmith

감사. 공감. 정확히 필요한 것-그룹 + 한 번의 연산으로 계산하고 결과에서 단일 행을 얻습니다.
Green

젠장. 나는 그것이 가능하다는 것을 몰랐다!
Hugo S. Mendes

1
@milkovsky-아니요 삭제할 필요가 없습니다. 나는이 질문과 많은 답변이 두 가지 다른 문제 를 해결하기 위해 분기되었다는 것이 자극을 발견했습니다 . 당신의 대답은 두 가지 방식으로 나옵니다- town열이 없으며 COUNTs잘못된 것 (사용자 대신 도시).
Rick James

37

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

/* 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

5
그렇지 않으면 mysql에서 별칭이 작동하지 않습니다. select count (*) from () agr
amas

4

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

마지막 것과 같은 것이 효과가 있지만 다른 해결책이 있는지 알고 싶었습니다 ..
Stavros

그리고 첫 번째 (분석 기능) 옵션을 사용할 수 없습니까? 어떤 데이터베이스 플랫폼을 사용하고 있습니까?
Tommi

@Stavros : 마지막 것은 느리다
Michael Buen

4

카운트로 주문하려면 (간단하게 들리지만 어떻게 해야하는지에 대한 답변을 찾을 수 없습니다) 당신은 할 수 있습니다 :

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

4

삭제되지 않은 답변 10 개; 대부분 사용자가 요청한 것을 하지 않습니다 . 대부분의 답변은 도시에 총 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)이 아닌지 점검 하는 것을 의미하며 ,이 문맥에서는 필요하지 않습니다.


2

milkovsky가 말한 것처럼 COUNT 내에서 DISTINCT를 사용할 수 있습니다

나의 경우에는:

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

이것은 user_id를 하나의 카운트로 간주하는 답변 투표 수를 가져옵니다.


2

나는 이것이 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

5
오래된 게시물에 답하는 데 아무런 문제가 없습니다. 그러나 코드 및 코드 자체에 대한 설명을 포함하십시오.
Shelvacu

MySQL IFNULL대신에 ( 대신 ISNULL)는 각 도시마다 다른 숫자로 이어집니다. 사용자는 총계를 원했습니다. 질문에 따르면, 174가 아니라 58이 총계입니다.
Rick James

1

도시 및 총 사용자 수를 선택하려면 아래에서이 쿼리를 사용하십시오.

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

이것은 (아마도 합리적으로)에 중복 된 "사용자"가 없다고 가정합니다 User.
Rick James

1

카운트 옵션으로 모든 쿼리 선택을 사용하려면 다음을 시도하십시오.

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

이 코드 스 니펫은 제한적이고 즉각적인 도움이 될 수 있습니다. 적절한 설명 이것이 문제에 대한 좋은 해결책 인지 보여줌으로써 장기적인 가치를 크게 향상시킬 것이며, 다른 비슷한 질문을 가진 미래 독자들에게 더 유용 할 것입니다. 제발 편집 당신이 만든 가정 등 일부 설명을 추가 할 답변을.
Toby Speight

0

다음 코드를 시도하십시오.

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

우리는이 코드를 사용하여 각각의 모든 ccode (회사 코드)에서 현재 calc의 총 직원 수를 찾습니다. 예제 : count (empno)는 ccode 1의 경우 1839이고 count (empno)는
ccode
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.