ホームページ  >  記事  >  データベース  >  データが欠落している場合でもデータベースから月ごとのレコードを取得するにはどうすればよいですか?

データが欠落している場合でもデータベースから月ごとのレコードを取得するにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-06 05:55:02720ブラウズ

How to Get Month-Wise Records from a Database Even When Data is Missing?

データが欠落している場合でも、データベース内の月単位のレコードを取得する

データベース管理システムでは、多くの場合、テーブルから月単位のレコードを抽出する必要があります。ただし、特定の月にデータ ポイントが欠落している場合には問題が発生します。この記事ではこの問題に対処し、値が存在しない場合でも月の完全なリストを生成し、対応するデータを取得する解決策を紹介します。

指定した元のクエリ:

SELECT COUNT( `userID` ) AS total, DATE_FORMAT( `userRegistredDate` , '%b' ) AS MONTH , YEAR( `userRegistredDate` ) AS year
FROM `users`
GROUP BY DATE_FORMAT( FROM_UNIXTIME( `userRegistredDate` , '%b' ) )

は、必要な出力が得られますが、既存のデータがある月のみです。欠落している月を処理するには、月の完全なリストを含むテーブルを使用し、それをユーザー テーブルと結合します。

SELECT COUNT(u.userID) AS total, m.month
FROM (
    SELECT 'Jan' AS MONTH
    UNION SELECT 'Feb' AS MONTH
    UNION SELECT 'Mar' AS MONTH
    UNION SELECT 'Apr' AS MONTH
    UNION SELECT 'May' AS MONTH
    UNION SELECT 'Jun' AS MONTH
    UNION SELECT 'Jul' AS MONTH
    UNION SELECT 'Aug' AS MONTH
    UNION SELECT 'Sep' AS MONTH
    UNION SELECT 'Oct' AS MONTH
    UNION SELECT 'Nov' AS MONTH
    UNION SELECT 'Dec' AS MONTH
) AS m
LEFT JOIN users u 
ON MONTH(STR_TO_DATE(CONCAT(m.month, ' 2013'),'%M %Y')) = MONTH(u.userRegistredDate)
AND YEAR(u.userRegistredDate) = '2013'
GROUP BY m.month
ORDER BY 1+1;

この結合テーブルにより、すべての月が確実に表現され、完全な結果セットが得られます。クエリを簡素化する別のアプローチを以下に示します。

SELECT COUNT(u.userID) AS total, DATE_FORMAT(merge_date,'%b') AS month, YEAR(m.merge_date) AS year
FROM (
    SELECT '2013-01-01' AS merge_date
    UNION SELECT '2013-02-01' AS merge_date
    UNION SELECT '2013-03-01' AS merge_date
    UNION SELECT '2013-04-01' AS merge_date
    UNION SELECT '2013-05-01' AS merge_date
    UNION SELECT '2013-06-01' AS merge_date
    UNION SELECT '2013-07-01' AS merge_date
    UNION SELECT '2013-08-01' AS merge_date
    UNION SELECT '2013-09-01' AS merge_date
    UNION SELECT '2013-10-01' AS merge_date
    UNION SELECT '2013-11-01' AS merge_date
    UNION SELECT '2013-12-01' AS merge_date
) AS m
LEFT JOIN users u 
ON MONTH(m.merge_date) = MONTH(u.userRegistredDate)
AND YEAR(m.merge_date) = YEAR(u.userRegistredDate)
GROUP BY m.merge_date
ORDER BY 1+1;

この変更されたクエリでは、日付の結合を使用して完全な月の範囲を表します。どちらの方法でも、すべての月のデータがない場合でも、月単位のレコードを生成するという目標は達成されます。

以上がデータが欠落している場合でもデータベースから月ごとのレコードを取得するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。