Mysql 获取某个特定客户去年下的总订单的查询在不存在订单的情况下检索重复日期
我正在进行一个查询,以获取某个特定客户(id=329)去年的总订单,使用两个表,即。orders和calendar(这是在不存在相应记录时获取零填充值)表 订单表:Mysql 获取某个特定客户去年下的总订单的查询在不存在订单的情况下检索重复日期,mysql,Mysql,我正在进行一个查询,以获取某个特定客户(id=329)去年的总订单,使用两个表,即。orders和calendar(这是在不存在相应记录时获取零填充值)表 订单表: SELECT c.datefield AS date , IFNULL((SELECT COUNT(o.order_date) FROM orders WHERE o.customer_id = 329 LIMIT 1), 0) AS TotalOrders FROM calendar AS c LEFT
SELECT c.datefield AS date
, IFNULL((SELECT COUNT(o.order_date) FROM orders
WHERE o.customer_id = 329 LIMIT 1), 0) AS TotalOrders
FROM calendar AS c
LEFT
JOIN orders AS o
ON c.datefield = DATE(o.order_date)
WHERE YEAR(c.datefield) = YEAR(CURRENT_DATE - INTERVAL 1 YEAR)
GROUP
BY date
, o.customer_id
ORDER
BY date ASC
日历表:
SELECT c.datefield AS date
, IFNULL((SELECT COUNT(o.order_date) FROM orders
WHERE o.customer_id = 329 LIMIT 1), 0) AS TotalOrders
FROM calendar AS c
LEFT
JOIN orders AS o
ON c.datefield = DATE(o.order_date)
WHERE YEAR(c.datefield) = YEAR(CURRENT_DATE - INTERVAL 1 YEAR)
GROUP
BY date
, o.customer_id
ORDER
BY date ASC
查询:
SELECT c.datefield AS date
, IFNULL((SELECT COUNT(o.order_date) FROM orders
WHERE o.customer_id = 329 LIMIT 1), 0) AS TotalOrders
FROM calendar AS c
LEFT
JOIN orders AS o
ON c.datefield = DATE(o.order_date)
WHERE YEAR(c.datefield) = YEAR(CURRENT_DATE - INTERVAL 1 YEAR)
GROUP
BY date
, o.customer_id
ORDER
BY date ASC
输出:
SELECT c.datefield AS date
, IFNULL((SELECT COUNT(o.order_date) FROM orders
WHERE o.customer_id = 329 LIMIT 1), 0) AS TotalOrders
FROM calendar AS c
LEFT
JOIN orders AS o
ON c.datefield = DATE(o.order_date)
WHERE YEAR(c.datefield) = YEAR(CURRENT_DATE - INTERVAL 1 YEAR)
GROUP
BY date
, o.customer_id
ORDER
BY date ASC
从上图中,您可以看到客户329于2020-01-02下了2笔订单。但检索到同一日期的两个额外行,顺序为0。我想可能是6882和670的客户。这是错误的!我只需要取329号顾客的订单
如何在查询中排除这些不需要的行,并仅检索客户329的订单总数?若要统计特定客户去年每月的订单总数,请使用此查询:
SELECT MONTHNAME(c.datefield) AS Month,
YEAR(CURRENT_DATE - INTERVAL 1 YEAR) AS Year,
IFNULL(o.TotalOrders, 0) AS Orders
FROM calendar AS c
LEFT JOIN (
SELECT MONTH(o.order_date) AS Month,
YEAR(o.order_date) AS Year,
COUNT(o.customer_id) AS TotalOrders
FROM orders AS o
WHERE YEAR(o.order_date) = YEAR(CURRENT_DATE - INTERVAL 1 YEAR) AND o.customer_id = 329
GROUP BY Month) AS o
ON MONTH(c.datefield) = o.Month
GROUP BY MONTH(c.datefield)
@草莓对不起,我不知道我做错了什么!抱歉,但我不知道你目前正在为链接问题接受的答案的哪一部分而挣扎。不知道为什么我得到的是-ve投票而不是解决方案@草莓我应该以文本格式发布mysql架构和数据,而不是这些屏幕截图吗?据我所知,您不能使用mysql 8,而必须使用
calendar
table来LEFT JOIN
,以便所有日期都显示为0。我可以问一下这个是这样发送到你的前端的吗?或者这是一个使用MySQL客户端软件运行的查询,以获取报告?我这样问是因为有一种方法可以删除日历
表,并使用带有循环的存储过程来创建所需的日期。@PeterDarmis顺便说一句,我已经发布了我自己问题的答案。