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

Patricia Arquette
リリース: 2024-11-06 05:55:02
オリジナル
716 人が閲覧しました

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!