データベース分析の基礎固め!月別売上集計をPHPとMySQLでスマートに実装

2024-06-30

PHPとMySQLを使って月と年のみでデータを取得する方法

  1. 必要なもの
  2. データベースの設定
  3. SQLクエリ
  4. PHPスクリプト
  5. クエリのテスト

必要なもの

このチュートリアルを完了するには、以下のものが必要です。

  • Webサーバー (Apache、Nginxなど)
  • MySQLデータベース
  • PHP

データベースの設定

まず、MySQLデータベースに接続して、データを取得するテーブルを作成する必要があります。この例では、orders という名前のテーブルを使用し、order_idcustomer_idorder_dateorder_amount というフィールドがあると仮定します。

CREATE TABLE orders (
  order_id INT PRIMARY KEY AUTO_INCREMENT,
  customer_id INT,
  order_date DATE,
  order_amount DECIMAL(10,2)
);

SQLクエリ

以下のSQLクエリを使用して、特定の月と年の注文を取得します。

SELECT
  MONTH(order_date) AS order_month,
  YEAR(order_date) AS order_year,
  SUM(order_amount) AS total_sales
FROM orders
WHERE MONTH(order_date) = ? AND YEAR(order_date) = ?
GROUP BY MONTH(order_date), YEAR(order_date)
ORDER BY order_year, order_month;

このクエリは、以下のことを行います。

  1. order_date フィールドから月と年を抽出します。
  2. 指定された月と年の注文のみを選択します。
  3. 注文金額を月と年ごとに合計します。
  4. 結果を年と月の昇順に並べ替えます。

PHPスクリプト

以下のPHPスクリプトを使用して、SQLクエリを実行し、結果をブラウザに表示します。

<?php

// データベース接続
$dbhost = "localhost";
$dbuser = "username";
$dbpass = "password";
$dbname = "database_name";

$conn = new mysqli($dbhost, $dbuser, $dbpass, $dbname);

// 対象年月を取得
$selected_month = $_GET['month'];
$selected_year = $_GET['year'];

// SQLクエリを実行
$sql = "SELECT
  MONTH(order_date) AS order_month,
  YEAR(order_date) AS order_year,
  SUM(order_amount) AS total_sales
FROM orders
WHERE MONTH(order_date) = ? AND YEAR(order_date) = ?
GROUP BY MONTH(order_date), YEAR(order_date)
ORDER BY order_year, order_month;";

$stmt = $conn->prepare($sql);
$stmt->bind_param("ii", $selected_month, $selected_year);
$stmt->execute();
$result = $stmt->get_result();

// 結果を出力
echo "<h1>" . $selected_year . "年" . $selected_month . "月の売上</h1>";
echo "<table border=1>";
echo "<tr><th>月</th><th>年</th><th>売上</th></tr>";
while ($row = $result->fetch_assoc()) {
  echo "<tr>";
  echo "<td>" . $row["order_month"] . "</td>";
  echo "<td>" . $row["order_year"] . "</td>";
  echo "<td>" . $row["total_sales"] . "</td>";
  echo "</tr>";
}
echo "</table>";

$conn->close();

?>
  1. データベースに接続します。
  2. GETパラメータから対象年月を取得します。
  3. SQLクエリを準備し、パラメータをバインドします。
  4. クエリを実行し、結果を取得します。
  5. 結果をHTMLテーブル形式で出力します。

クエリ

上記のスクリプトを実行するには、ブラウザのアドレスバーに以下のURLを入力する必要があります。

http://localhost/script.php?month=1&year=2023

この例では、1月の2023年のデータが表示されます。月は1から12、年は任意の値に置き




CREATE TABLE orders (
  order_id INT PRIMARY KEY AUTO_INCREMENT,
  customer_id INT,
  order_date DATE,
  order_amount DECIMAL(10,2)
);
<?php

// データベース接続
$dbhost = "localhost";
$dbuser = "username";
$dbpass = "password";
$dbname = "database_name";

$conn = new mysqli($dbhost, $dbuser, $dbpass, $dbname);

// 対象年月を取得
$selected_month = $_GET['month'];
$selected_year = $_GET['year'];

// SQLクエリを実行
$sql = "SELECT
  MONTH(order_date) AS order_month,
  YEAR(order_date) AS order_year,
  SUM(order_amount) AS total_sales
FROM orders
WHERE MONTH(order_date) = ? AND YEAR(order_date) = ?
GROUP BY MONTH(order_date), YEAR(order_date)
ORDER BY order_year, order_month;";

$stmt = $conn->prepare($sql);
$stmt->bind_param("ii", $selected_month, $selected_year);
$stmt->execute();
$result = $stmt->get_result();

// 結果を出力
echo "<h1>" . $selected_year . "年" . $selected_month . "月の売上</h1>";
echo "<table border=1>";
echo "<tr><th>月</th><th>年</th><th>売上</th></tr>";
while ($row = $result->fetch_assoc()) {
  echo "<tr>";
  echo "<td>" . $row["order_month"] . "</td>";
  echo "<td>" . $row["order_year"] . "</td>";
  echo "<td>" . $row["total_sales"] . "</td>";
  echo "</tr>";
}
echo "</table>";

$conn->close();

?>

クエリの実行

http://localhost/script.php?month=1&year=2023

解説

  1. データベースに接続します ($conn = new mysqli(...))
  2. GETパラメータから対象年月を取得します ($selected_month = $_GET['month']; $selected_year = $_GET['year'];)
  3. SQLクエリを準備し、パラメータをバインドします ($stmt = $conn->prepare($sql); $stmt->bind_param("ii", $selected_month, $selected_year);)
  4. クエリを実行し、結果を取得します ($stmt->execute(); $result = $stmt->get_result();)
  5. 結果をHTMLテーブル形式で出力します (echo "<table>...</table>";)
  6. データベース接続を閉じます ($conn->close();)

注意事項

  • このコードはあくまで例であり、実際の状況に合わせて変更する必要があります。
  • データベースへの接続情報などは、ご自身の環境に合わせて変更してください。
  • セキュリティ対策として、ユーザー入力データは必ずエスケープ処理を行ってください。



PHPとMySQLで月と年のみでデータを取得するその他の方法

MONTH() と YEAR() 関数を使用したサブクエリ

この方法は、サブクエリを使用して、MONTH()YEAR() 関数を直接使用するものです。

SELECT
  y.year,
  m.month,
  SUM(order_amount) AS total_sales
FROM orders o
JOIN (
  SELECT DISTINCT YEAR(order_date) AS year
  FROM orders
) AS y
ON o.YEAR(order_date) = y.year
JOIN (
  SELECT DISTINCT MONTH(order_date) AS month
  FROM orders
) AS m
ON o.MONTH(order_date) = m.month
WHERE y.year = ? AND m.month = ?
GROUP BY y.year, m.month
ORDER BY y.year, m.month;

このクエリは、前述のクエリとほぼ同じ結果を返しますが、より冗長で読みづらくなっています。

集計関数を使用した GROUP BY

この方法は、GROUP BY 句と集計関数を使用して、月と年の売上を直接グループ化します。

SELECT
  YEAR(order_date) AS order_year,
  MONTH(order_date) AS order_month,
  SUM(order_amount) AS total_sales
FROM orders
GROUP BY YEAR(order_date), MONTH(order_date)
HAVING YEAR(order_date) = ? AND MONTH(order_date) = ?
ORDER BY order_year, order_month;

このクエリは、前述のクエリよりも簡潔で読みやすいですが、サブクエリを使用しないため、パフォーマンスが若干低下する可能性があります。

  • シンプルで読みやすいコードを優先する場合は、GROUP BY を使用した方法がおすすめです。
  • パフォーマンスが重要な場合は、サブクエリを使用した方法がおすすめです。
  • 複雑なクエリを記述する場合は、サブクエリの方が柔軟性が高いかもしれません。

いずれの方法を使用する場合も、必ずテストを行い、期待通りの結果が得られていることを確認してください。

補足:

  • 上記のコードはすべて、orders テーブルの構造が前述のとおりであることを前提としています。テーブル構造が異なる場合は、クエリを適宜変更する必要があります。
  • 実際の開発においては、エラー処理や接続管理などのロジックを追加する必要があります。

php mysql


データベースの検索・ソート・インデックス作成に影響を与える文字セットと照合順序

データベースでデータを扱う際、文字コードと照合順序という2つの概念を理解することが重要です。文字コードは文字をどのように表現するかを定義し、照合順序は文字列の比較方法を定義します。これらの概念は、データベース内のデータの検索、ソート、インデックス作成などに影響を与えます。...


MySQLクエリで数値と非数値テキストを分離する5つのテクニック

SUBSTRING_INDEX 関数は、文字列から指定された文字列を最初に発生した場所から切り取ることができます。この関数を使用して、数値部分だけを抽出することができます。このクエリは、'123abc456' という文字列から '123' という部分を抽出し、それを数値に変換します。結果は 123 になります。...


Laravel Eloquentでデータ操作をレベルアップ:limit、take、whereを駆使した応用例

Eloquent で結果を制限するには、いくつかの方法があります。limit() メソッドを使用して、取得するレコードの数を指定できます。たとえば、次のコードは、users テーブルから最初の 10 件のレコードを取得します。take() メソッドは limit() メソッドに似ていますが、コレクション全体に対して適用されます。たとえば、次のコードは、users テーブルから最初の 10 件のレコードを含むコレクションを作成します。...


【保存版】MariaDBで複数行挿入を使いこなす方法:詳細解説とサンプルコード

複数サブクエリを用いる INSERT 文の構文例次の例では、customers テーブルに 2 つのサブクエリからデータを挿入します。この例では、最初のサブクエリは users テーブルから first_name、email、city 列を選択し、customers テーブルに挿入します。2 番目のサブクエリは users テーブルから last_name 列のみを選択し、email 列は NULL に設定し、city 列は 'New York' に設定して customers テーブルに挿入します。...