给出两个表orders (order_id, date, $, customer_id)
和customers (ID, name)
这是我的方法,但我不确定它是否有效,我想知道是否有更快/更好的方法来解决这些问题:
1)找出在customers
2018年7月9日至少赚了一个order
的{{1}}的人数
date
2)找出在2018年7月9日没有成为Select count (distinct customer_id)
From
(
Select customer_id from orders a
Left join customer b
On a.customer_id = b.ID
Group by customer_id,date
Having date = 7/9/2018
) a
的{{1}}的人数
customers
3)找到销售额最高介于7/1和7/30之间的order
Select count (customer_id) from customer where customer_id not in
(
Select customer_id from orders a
Left join customer b
On a.customer_id = b.ID
Group by customer_id,date
Having date = 7/9/2018
)
谢谢
答案 0 :(得分:3)
对于问题1,有效的解决方案可能如下所示:
SELECT COUNT(DISTINCT customer_id) x
FROM orders
WHERE date = '2018-09-07'; -- or is that '2018-07-09' ??
对于问题2,有效的解决方案可能如下所示:
SELECT COUNT(*) x
FROM customer c
LEFT
JOIN orders o
ON o.customer_id = x.customer_id
AND o.date = '2018-07-09'
WHERE o.crder_id IS NULL;
假设没有联系,问题3的有效解决方案可能如下所示:
SELECT date
, COUNT(*) sales
FROM orders
WHERE date BETWEEN '2018-07-01' AND '2018-07-30'
GROUP
BY date
ORDER
BY sales DESC
LIMIT 1;
答案 1 :(得分:1)
MySQL中日期的默认格式为YYYY-MM-DD
,尽管可以自定义。您必须在其周围加上引号,否则它将被视为算术表达式。
您的查询都不需要与customer
表联接。客户ID已在orders
表中,并且您没有返回有关客户的任何信息(例如姓名或地址),而只是在计算他们。
1)您不需要子查询或分组。
SELECT COUNT(DISTINCT customer_id)
FROM orders
WHERE date = '2018-07-09'
2)再次,您不需要在子查询中使用GROUP BY
。还有一种比NOT IN
更好的模式来获取不匹配的行数。
SELECT COUNT(*)
FROM customer AS c
LEFT JOIN order AS o on c.id = o.customer_id AND o.date = '2018-07-09'
WHERE o.id IS NULL
有关各种模式,请参见Return row only if value doesn't exist。
3)您不能在外部查询中使用MAX($)
,因为内部查询不会返回具有该名称的列。但是即使您解决了该问题,它也仍然无法使用,因为date
列不一定来自具有最大值的同一行。有关更多说明,请参见SQL select only rows with max value on a column。
您根本不需要子查询。使用查询返回每天的总销售额,然后使用ORDER BY
获得最高的销售额。
SELECT date, SUM($) AS total_sales
FROM orders
WHERE date BETWEEN '2018-07-01' AND '2017-07-30'
GROUP BY date
ORDER BY total_sales DESC
LIMIT 1
如果“最多的销售”是指“最多的销售”,则将SUM($)
替换为COUNT(*)
。