【SQL】同一フィールドの異なるレコード数(頻度統計)を統計するクエリの書き方


更新1:
参考者のフィードバック文には「COUNT書き方」の可用性の問題がありますが、ここではまず概念的な問題についてお話しします.周知のように、リレーショナル・データベースの考え方とSQL仕様はIBMに由来しています.その後、(完全に遵守していない)関係型データベースの理論思想とSQL基準に基づいて、多くのビジネス版やコミュニティオープンソース版の関係型データベースソフトウェア製品が登場しました.このうち商業版で有名なのはIBMのDB 2、OracleのOracle、MicrosoftのSQL Serverです.オープンソース無料版で流行しているのはMySQL(現在もOracle社)/MariaDB(MySQLがOracle化された新しいブランチ)、PostgreSQL、SQLiteです.これらのRDBMS製品はいずれもリレーショナルであり、SQLをサポートしているが、各製品の実装は異なり、SQL標準のサポートも異なる.同じデータベース製品でも、比較的大きなバージョンの更新が行われると、設計と実装が一新される可能性があります.したがって、データベースとデータベースの間、およびデータベースのバージョンとバージョンの間の差異という概念が必要です.以下の内容は第3版「高性能MySQL」から整理され、主にMySQL 5に基づいている.5と書いてありますが、個人的に挙げた観光客データの例を調べると、MySQL 5という印象があります.6と5.7のバージョンでテストされました.したがって、他のデータベース製品、さらにはMySQLを使用しているが、他の古いバージョンや古い将来の新しいバージョンを使用している場合は、クエリが適用されない場合は、それが正常なことと見なされます.
SQLクエリーでは、1つの文でフィールド内の異なるレコード値の数、すなわち周波数統計を統計する必要があることがよくあります.『高性能MySQL』(https://book.douban.com/subject/23008813/)この「葵の宝典」では、二つの方法がまとめられているのを見て、ここでもう一度整理して記録します.一つは「SUM」法です.もう一つは「COUNT」法です.
 
サンプル表「visitor_province_day」のデータに示すように、各省に滞在する観光客の日数を記録します.現在、「陝西省」や「浙江省」のようないくつかの省が観光客に観光された回数を知りたいなら、記録数を直接数えて統計することができます.
mysql> select * from visitor_province_day;
+---------+-----------+-----+
| visitor | province  | day |
+---------+-----------+-----+
|       1 |        |   5 |
|       1 |        |   2 |
|       1 |        |   9 |
|      11 |        |   7 |
|      11 |        |   3 |
|      11 |        |   1 |
|      11 |        |   4 |
|      11 |        |   1 |
|      11 |        |   5 |
|      11 |        |   9 |
|      11 |        |  11 |
+---------+-----------+-----+

「SUM」の書き方.
 
SELECT SUM(IF(vpd.province = '   ', 1, 0)) AS cnt_sx, SUM(IF(vpd.province = '   ', 1, 0)) AS cnt_zj
FROM visitor_province_day AS vpd;

 
 
 
 
+--------+--------+
| cnt_sx | cnt_zj |
+--------+--------+
|      3 |      3 |
+--------+--------+

「COUNT」の書き方.
 
SELECT COUNT(vpd.province = '   ' OR NULL) AS cnt_sx, COUNT(vpd.province = '   ' OR NULL) AS cnt_zj
FROM visitor_province_day AS vpd;

 
 
 
 
+--------+--------+
| cnt_sx | cnt_zj |
+--------+--------+
|      3 |      3 |
+--------+--------+

結果から,試料中の2つの省の頻度は同じであり,いずれも3回であることが分かった.複数のマッチングを行う場合は、IN('陝西省','浙江省')のように、"="を"IN"リストの形式に変更すればよい.さらに、等号を「LIKE」や「REGEXP」に置き換えることもできますよ!