web-dev-qa-db-ja.com

同じselectステートメントでcountとgroup byを使う方法

私はによってグループを持つSQLのselectクエリを持っています。グループ化した後のすべてのレコードをステートメントでカウントしたい。 SQLから直接これのための方法はありますか?たとえば、ユーザーと一緒にテーブルを作成して、さまざまな町や町を選択したいとします。 合計 利用者数

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

すべての町を含む列と、すべての行に含まれるユーザー数を含む列を作成したいと思います。

合計3つの町と58人のユーザーがいる場合の結果の例は次のとおりです。

Town         Count
Copenhagen   58
NewYork      58
Athens       58
203
Stavros

これはあなたが望むことをするでしょう(それぞれの中のユーザーの数で町のリスト):

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
259
Oded

COUNT(DISTINCT ...) を使用できます。

SELECT COUNT(DISTINCT town) 
FROM user
136
milkovsky

他の方法は次のとおりです。

/* 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
31
ZhenYu Wang

あなたが数で注文したいなら(単純に聞こえます、しかし、私はそれをする方法の積み重ねの答えを見つけることができません)あなたはそうすることができます:

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

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
3
Tommi

Milkovskyが言ったようにCOUNT内でDISTINCTを使用できます。

私の場合:

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

これは、1つのカウントと同じuser_idと見なされる回答票の数を引きます。

2
Jur P

これは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
2
Marcus

削除されていない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でないことをチェックすることを意味します。これはこの文脈では不要です。

1
Rick James

町と総ユーザー数を選択する場合は、以下のクエリを使用できます。

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

あなたがカウントオプションですべてのクエリを選択を使用したい場合は、これを試してください...

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

次のコードを試してください。

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