Mysql

將一個表中的日期值與另一個表中的多個值進行比較以按年齡分類

  • April 29, 2022

我創建了一個表單,允許使用者輸入多個無限制的月份數值,並將它們標記為用於對庫存進行分類以對每個項目的年齡進行分類。

表 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

引用自:https://dba.stackexchange.com/questions/311466