Mysql
將一個表中的日期值與另一個表中的多個值進行比較以按年齡分類
我創建了一個表單,允許使用者輸入多個無限制的月份數值,並將它們標記為用於對庫存進行分類以對每個項目的年齡進行分類。
表 1 - AgeConfig - 使用者手動輸入
表 2 - 庫存
我正在嘗試使用 CASE 在 SQL 中呈現這一點,但我不知道如何將它與可變數量的行進行比較,並確保我從最高開始並工作到最低。
我正在嘗試使用 CASE 但被難住了
SELECT customer_id, item_no, entry_date, CASE WHEN (TIMESTAMPDIFF(MONTH, entry_date, NOW()) > MAX(start_month)) THEN `label` WHEN (TIMESTAMPDIFF(MONTH, entry_date, NOW()) > 2NDMAX(start_month)) THEN `label` WHEN (TIMESTAMPDIFF(MONTH, entry_date, NOW()) > 3RDMAX(start_month)) THEN `label` ... END, qty, cost FROM Inventory INNER JOIN AgeConfig USING (customer_id) WHERE customer_id = 171
我不知道如何從最高到最低逐步測試,然後使用相應的標籤,結果是:
我最終在兩者之間使用 php 來獲得快速的解析度 - 可能不是最有效的,但它確實有效。仍然有興趣知道是否有僅 SQL 的解決方案
SELECT period_start_mth, period_label FROM AgeConfig WHERE customer_id = 171 ORDER BY period_start_mth DESC
然後使用生成的數組建構 SQL
$entry_date_query = ""; if ( !empty($agePeriods) ) { foreach ( $agePeriods as $period ) { $entry_date_query .= "WHEN (TIMESTAMPDIFF(MONTH, entry_date, NOW()) >= {$period["period_start_mth"]}) THEN '{$period["period_label"]}'".PHP_EOL; } $entry_date_query = "CASE" . PHP_EOL . $entry_date_query . "ELSE 'Other'" . PHP_EOL . "END AS entry_date_age,"; } else { $entry_date_query = "'Default Catch All' as entry_date_age,"; } $query = "SELECT customer_id, item_no, entry_date, $entry_date_query qty, cost FROM Inventory WHERE customer_id = 171";
WITH cte AS ( SELECT *, COALESCE(LEAD(start_month) OVER (PARTITION BY customer_id ORDER BY start_month), 10000) - 1 finish_month FROM AgeConfig ) SELECT * FROM Inventory JOIN cte USING (customer_id) WHERE TIMESTAMPDIFF(MONTH, entry_date, CURRENT_DATE) BETWEEN start_month AND finish_month
https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=78b28b19df1260ef6ce0a76aac3cfcd0