그룹별로 SQL 선택 쿼리가 있습니다. 그룹 별 명세서 다음의 모든 레코드를 계산하고 싶습니다. SQL에서 직접이 방법이 있습니까? 예를 들어, 사용자가있는 테이블이 있으면 다른 도시와 총 사용자 수 를 선택하고 싶습니다.
select town, count(*) from user
group by town
모든 도시의 열과 모든 행의 사용자 수를 가진 열을 갖고 싶습니다.
3 개의 도시와 58 명의 사용자가있는 결과의 예는 다음과 같습니다.
Town Count
Copenhagen 58
NewYork 58
Athens 58
답변
이것은 당신이 원하는 것을 할 것입니다 (각 도시의 사용자 수를 가진 도시 목록) :
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
답변
당신은 사용할 수 있습니다 COUNT(DISTINCT ...)
:
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
답변
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
답변
삭제되지 않은 답변 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)이 아닌지 점검 하는 것을 의미하며 ,이 문맥에서는 필요하지 않습니다.
답변
milkovsky가 말한 것처럼 COUNT 내에서 DISTINCT를 사용할 수 있습니다
나의 경우에는:
select COUNT(distinct user_id) from answers_votes where answer_id in (694,695);
이것은 user_id를 하나의 카운트로 간주하는 답변 투표 수를 가져옵니다.