MySQL 単一テーブルからの包括的なデータの取得: 空の行と最近のトランザクションをカバーする
この説明では、共通の課題に対処することを目的としています。データベースにクエリを実行するときに直面するのは、最近のトランザクションと空き日の両方を結果に組み込む方法です。具体的には、アクティビティがなかった日の空の行を含めながら、過去 7 日間の販売トランザクションを取得することに重点を置きます。
まず、COALESCE() 関数の機能を活用します。式が NULL と評価された場合のデフォルト値。この場合、空の行のデフォルト値として 0 を使用します。
その後、サブクエリを作成して、過去 7 日間にわたる日付の包括的なリストを生成します。これは完全な結果セットの基礎として機能し、空の行が確実に含まれるようにします。
最後に、生成された日付リストとトランザクション テーブルの間で LEFT JOIN 操作を実行し、PURCHASE_DATE に基づいてレコードを照合します。カラム。これにより、トランザクションが空の日付レコードとマージされ、毎日の合計売上高を計算し、最近のトランザクションと空の行の両方を表示できるようになります。
結果のクエリは、過去 7 件の包括的な概要を効果的に提供します。販売取引の日数。記録された活動がなかった日も考慮されます。
参照用の完全なクエリは次のとおりです:
SELECT t1.purchase_date, COALESCE(SUM(t1.amount + t2.amount), 0) AS amount FROM ( SELECT DATE_FORMAT(a.Date,'%Y-%m-%d') AS purchase_date, '0' AS amount FROM ( SELECT CURDATE() - INTERVAL (a.a + (10 * b.a) + (100 * c.a)) DAY AS Date FROM (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS a CROSS JOIN (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS b CROSS JOIN (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS c ) a WHERE a.Date BETWEEN NOW() - INTERVAL 7 DAY AND NOW() ) t1 LEFT JOIN ( SELECT DATE_FORMAT(purchase_date, '%Y-%m-%d') AS purchase_date, COALESCE(SUM(amount), 0) AS amount FROM transactions WHERE purchase_date BETWEEN NOW() - INTERVAL 7 DAY AND NOW() GROUP BY purchase_date ) t2 ON t2.purchase_date = t1.purchase_date GROUP BY t1.purchase_date ORDER BY t1.purchase_date DESC;
以上がMySQL テーブルから過去 7 日間の完全な売上データ (トランザクションのない日も含む) を取得するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。