【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」のデータに示すように、各省に滞在する観光客の日数を記録します.現在、「陝西省」や「浙江省」のようないくつかの省が観光客に観光された回数を知りたいなら、記録数を直接数えて統計することができます.
「SUM」の書き方.
「COUNT」の書き方.
結果から,試料中の2つの省の頻度は同じであり,いずれも3回であることが分かった.複数のマッチングを行う場合は、IN('陝西省','浙江省')のように、"="を"IN"リストの形式に変更すればよい.さらに、等号を「LIKE」や「REGEXP」に置き換えることもできますよ!
参考者のフィードバック文には「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」に置き換えることもできますよ!