COUNT(DISTINCT name)

2024-05-09

SQLiteでカウント、グループ化、並べ替えを行う

概要

SQLiteは、軽量で使いやすいデータベース管理システムです。ここでは、SQLiteでデータの集計と分析を行うために役立つ、COUNT関数、GROUP BY句、ORDER BY句の使い方について、分かりやすく説明します。

COUNT関数

COUNT関数は、指定された列または式の値の個数をカウントします。構文は以下の通りです。

COUNT([ALL | DISTINCT] expression);
  • ALL (省略可):すべての値をカウントします。重複もカウントされます。
  • DISTINCT:重複する値を除いた個数をカウントします。

以下の表 customers に、顧客の名前と購入件数が格納されています。

customer_idnamepurchase_count
1田中太郎5
2佐藤次郎3
3鈴木三郎2
1田中太郎7

すべての顧客の合計購入件数をカウントするには、以下のクエリを実行します。

SELECT COUNT(*) AS total_purchases
FROM customers;

このクエリは、17という結果を返します。これは、すべての顧客の購入件数の合計です。

SELECT COUNT(DISTINCT name) AS unique_customers
FROM customers;

GROUP BY句

GROUP BY句は、結果セットを列の値に基づいてグループ分けします。構文は以下の通りです。

SELECT expression1, expression2, ...
FROM table_name
GROUP BY column1, column2, ...;

上記の表 customers を、購入件数に基づいてグループ分けし、各グループの顧客の名前と合計購入件数を表示するには、以下のクエリを実行します。

SELECT name, COUNT(*) AS purchase_count
FROM customers
GROUP BY name
ORDER BY purchase_count DESC;

このクエリは、以下の結果を返します。

namepurchase_count
田中太郎12
佐藤次郎3
鈴木三郎2

ORDER BY句

SELECT expression1, expression2, ...
FROM table_name
ORDER BY column1, column2, ... ASC | DESC;
  • ASC:昇順で並べ替えます。

上記のクエリ結果を、購入件数の降順に並べ替えるには、以下のクエリを実行します。

SELECT name, COUNT(*) AS purchase_count
FROM customers
GROUP BY name
ORDER BY purchase_count DESC;
namepurchase_count
田中太郎12
佐藤次郎3
鈴木三郎2



SQLiteでカウント、グループ化、並べ替えを行うサンプルコード

前提条件

このサンプルコードを実行するには、SQLiteデータベースと、以下の表 customers が作成されている必要があります。

CREATE TABLE customers (
  customer_id INTEGER PRIMARY KEY AUTOINCREMENT,
  name TEXT NOT NULL,
  purchase_count INTEGER NOT NULL
);

コード

-- すべての顧客の合計購入件数をカウント
SELECT COUNT(*) AS total_purchases
FROM customers;

-- 重複する値を除いた顧客の名前の個数をカウント
SELECT COUNT(DISTINCT name) AS unique_customers
FROM customers;

-- 購入件数に基づいて顧客をグループ分けし、各グループの顧客の名前と合計購入件数を表示
SELECT name, COUNT(*) AS purchase_count
FROM customers
GROUP BY name
ORDER BY purchase_count DESC;

説明

  1. 最初のクエリは、COUNT関数を使用してすべての顧客の合計購入件数をカウントします。
  2. 2番目のクエリは、COUNT関数とDISTINCTキーワードを使用して、重複する値を除いた顧客の名前の個数をカウントします。
  3. 3番目のクエリは、GROUP BY句とCOUNT関数を使用して、購入件数に基づいて顧客をグループ分けし、各グループの顧客の名前と合計購入件数を表示します。ORDER BY句を使用して、結果を降順に並べ替えています。

実行結果

17
3
田中太郎, 12
佐藤次郎, 3
鈴木三郎, 2

補足

  • このサンプルコードは、基本的な操作のみを示しています。より複雑な集計や分析を行うには、WHERE句やHAVING句などの他のクエリ構文と組み合わせて使用することができます。
  • 詳細については、SQLiteの公式ドキュメントを参照してください。



SQLiteでカウント、グループ化、並べ替えを行うその他の方法

サブクエリ

サブクエリを使用して、COUNT関数、GROUP BY句、ORDER BY句を実行することができます。構文は以下の通りです。

SELECT expression1, expression2, ...
FROM table_name
WHERE condition
ORDER BY (
  SELECT expression
  FROM subquery
  WHERE condition
);
SELECT name, purchase_count
FROM customers
ORDER BY (
  SELECT COUNT(*)
  FROM customers
  WHERE c.name = customers.name
);
namepurchase_count
田中太郎12
佐藤次郎3
鈴木三郎2

ウィンドウ関数

SELECT expression1, expression2, ...
FROM table_name
OVER (PARTITION BY column1, column2, ... ORDER BY column3, column4, ...)
AS window_name;
SELECT name, COUNT(*) OVER (PARTITION BY name ORDER BY purchase_count DESC) AS purchase_count
FROM customers;
namepurchase_count
田中太郎12
佐藤次郎3
鈴木三郎2

外部ライブラリ

SQLite FTS は、全文検索機能を提供するSQLite拡張です。FTSには、COUNT関数、GROUP BY句、ORDER BY句などの集計関数と分析機能が含まれています。

SQLクエリビルダー

SQLクエリビルダーは、GUIを使用してSQLクエリを作成するツールです。SQLクエリビルダーを使用すると、COUNT関数、GROUP BY句、ORDER BY句などの複雑なクエリを簡単に作成することができます。

上記以外にも、SQLiteでカウント、グループ化、並べ替えを行う方法はいくつかあります。自分に合った方法を選択してください。


sorting sqlite grouping


SQLiteOpenHelper活用:Androidでテーブルの存在確認とデータベースオープン

ここでは、Android SQLiteデータベースでテーブルの存在を確認する2つの方法を詳しく解説します。この方法は、SQLiteDatabase クラスの query() メソッドを使用して、テーブルの存在を確認します。コード例:SQLiteDatabase オブジェクトを取得します。...


SQLite ALTER TABLE で NOT NULL 制約を設定する方法

例:この例では、customers テーブルに email と phone_number という2つの列が追加されます。email 列は最大255文字の文字列、phone_number 列は整数型です。複数の列を追加する際の注意点:すべての列にデータ型を指定する必要があります。...


Efficient paging in SQLite with millions of records

SQLite は軽量で使いやすいデータベースエンジンですが、数百万のレコードを扱う場合、パフォーマンスが低下する可能性があります。この問題に対処するために、ページングと呼ばれるテクニックが使用されます。ページングは、データベースを複数の小さな部分に分割することで、メモリ使用量を減らし、クエリのパフォーマンスを向上させることができます。...


データベース操作の安全性を高める:SQLiteにおけるトランザクションとロールバック

暗黙的トランザクションの場合AUTOCOMMITモードが有効な場合:ステートメントは暗黙的なトランザクションで実行され、失敗時に自動的にロールバックされます。AUTOCOMMITモードが無効な場合:ステートメントは明示的なトランザクションの一部として実行されなければならず、失敗時に自動ロールバックはされません。明示的なトランザクションのロールバックは、ROLLBACKステートメントを手動で実行する必要があります。...