如何从 mysql join interval yearmonth 设置默认值

How to set default value from mysql join interval yearmonth

我的查询有问题。我有两个 table,我想加入它们以根据第一个 table 的主键获取结果,但我缺少第一个 table.

的 1 个数据

this my fiddle

如您所见,我缺少第 1 个月的“xx3”

我试过改变左连接和右连接,但结果还是一样。 如您所见,如果没有 qty,我必须设置 coalesce(sum(b.sd_qty),0) as total,,默认设置 0

您还应该将 table 交叉连接到不同的日期:

SELECT a.item_code,
       COALESCE(SUM(b.sd_qty), 0) total,
       DATE_FORMAT(d.sd_date, '%m-%Y') month_year
FROM item a 
CROSS JOIN (
  SELECT DISTINCT sd_date 
  FROM sales_details 
  WHERE sd_date >= '2020-04-01' - INTERVAL 3 MONTH AND sd_date < '2020-05-01'
) d 
LEFT JOIN sales_details b 
ON a.item_code = b.item_code AND b.sd_date = d.sd_date
GROUP BY month_year, a.item_code
ORDER BY month_year, a.item_code;

或者,对于 MySql 8.0+,使用递归 CTE returns 您想要结果的所有月份的开始日期,可以交叉连接到 table:

WITH RECURSIVE dates AS (
  SELECT '2020-04-01' - INTERVAL 3 MONTH AS sd_date
  UNION ALL
  SELECT sd_date + INTERVAL 1 MONTH
  FROM dates 
  WHERE sd_date + INTERVAL 1 MONTH < '2020-05-01'
)
SELECT a.item_code,
       COALESCE(SUM(b.sd_qty), 0) total,
       DATE_FORMAT(d.sd_date, '%m-%Y') month_year
FROM item a CROSS JOIN dates d 
LEFT JOIN sales_details b 
ON a.item_code = b.item_code AND DATE_FORMAT(b.sd_date, '%m-%Y') = DATE_FORMAT(d.sd_date, '%m-%Y')
GROUP BY month_year, a.item_code
ORDER BY month_year, a.item_code;

参见demo