如何从 mysql join interval yearmonth 设置默认值
How to set default value from mysql join interval yearmonth
我的查询有问题。我有两个 table,我想加入它们以根据第一个 table 的主键获取结果,但我缺少第一个 table.
的 1 个数据
如您所见,我缺少第 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。
我的查询有问题。我有两个 table,我想加入它们以根据第一个 table 的主键获取结果,但我缺少第一个 table.
的 1 个数据如您所见,我缺少第 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。