私はによってグループを持つSQLのselectクエリを持っています。グループ化した後のすべてのレコードをステートメントでカウントしたい。 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
あなたが数で注文したいなら(単純に聞こえます、しかし、私はそれをする方法の積み重ねの答えを見つけることができません)あなたはそうすることができます:
SELECT town, count(town) as total FROM user
GROUP BY town ORDER BY total DESC
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
Milkovskyが言ったようにCOUNT内でDISTINCTを使用できます。
私の場合:
select COUNT(distinct user_id) from answers_votes where answer_id in (694,695);
これは、1つのカウントと同じ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
削除されていない10の回答ほとんどの場合、notはユーザーが要求したことを実行します。ほとんどの回答では、質問を誤って読みましたが、each _町には合計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
からは1行しかないので、CROSS JOIN
はそれ以外の場合ほど大きくはありません。
通常のパターンはCOUNT(*)
ではなくCOUNT(town)
です。後者はtown
がnullでないことをチェックすることを意味します。これはこの文脈では不要です。
町と総ユーザー数を選択する場合は、以下のクエリを使用できます。
SELECT Town, (SELECT Count(*) FROM User) `Count` FROM user GROUP BY Town;
あなたがカウントオプションですべてのクエリを選択を使用したい場合は、これを試してください...
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;