从一张桌子上抓取所有取消的客户,并在另一张桌子上计算他们的所有订单

Posted

技术标签:

【中文标题】从一张桌子上抓取所有取消的客户,并在另一张桌子上计算他们的所有订单【英文标题】:Grab all cancelled customers from one table and count all their orders in another 【发布时间】:2020-01-22 15:56:50 【问题描述】:

如何对以下内容运行 SQL 查询:

我的第一个表名为 "customers",如果 "status" 等于 ,我想获得 "customer_id" “取消”

例如

Customer ID | Status
001           active
002           cancelled
003           cancelled

我的第二个表名为 "order_data",我想从第一个表中获取与 "customer_id"'s 匹配的所有记录,这些记录具有“status” " "已发货"。

Customer ID | Status
001           shipped
001           shipped
002           failed
003           shipped

所以我从第一个表中获取所有已取消的客户,然后通过第二个表运行这些客户,以计算每个 ID 已发货的订单。

这是为被取消的客户抓取电子邮件:

SELECT customer_id
FROM customers
WHERE status = 'cancelled'

如何获取这些客户 ID,然后在第二个表中找到他们所有已发货的订单。期望的结果是客户 ID 列表和每个订单的数量?

Customer ID | Orders
001           2
002           0
003           1

【问题讨论】:

向我们展示一些示例表数据和预期结果(格式文本,无图像。) 为什么在示例输出中包含Customer ID - 001 @Rob 你为什么不更新这个问题:***.com/questions/59859226/… ??? 5000+ 的人会这样做吗? @YogeshSharma 这是第一个表中的客户 ID,遍历第二个表,然后输出旁边的订单数 这能回答你的问题吗? SQL query to count number of Woocommerce orders by a list of users 【参考方案1】:

您可以使用 correlated 子查询(在问题编辑之前):

SELECT c.customer_id,
       (SELECT COUNT(*)
        FROM order_data od 
        WHERE od.customer_id = c.customer_id AND od.status = 'shipped'
       ) AS Orders
FROM customers c
WHERE c.status = 'cancelled'
GROUP BY c.customer_id;

编辑:你也可以LEFT JOIN

SELECT c.customer_id, COUNT(DISTINCT od.customer_id) AS Orders
FROM customers c LEFT JOIN
     order_data od 
     ON od.customer_id = c.customer_id AND od.status = 'shipped'
WHERE c.status = 'cancelled'
GROUP BY c.customer_id; 

注意:如果您想要所有客户,请删除带有c.status = 'cancelled' 的外部where 子句。

【讨论】:

删除此答案的相关子查询部分以获得+1! 这是此处回答的两个答案的组合:***.com/questions/59859226/… 带有一个新信息“已发货”和新表名...我的意思是也打电话给您将此问题标记为重复.干杯! @VBoka 对不起,我在发布这个之前已经这样做了 @Rob,是的,我知道,但你不同意!您应该按照我们的要求更新该问题(您打开的第一个问题)......而不是打开新问题......并回答那里不正确的问题并让人们投票,因为这些都是有用的答案。投票=它帮助了我。因为这里和那里的每一个答案都有帮助......然后你从第一个问题中选择正确的一个。【参考方案2】:

下面的查询怎么样

select customer_id, count(*)
from order_data
where status = 'shipped'
and customer_id in (select customer_id from customers where status = 'cancelled')
group by customer_id

【讨论】:

以上是关于从一张桌子上抓取所有取消的客户,并在另一张桌子上计算他们的所有订单的主要内容,如果未能解决你的问题,请参考以下文章

从一张桌子获取待处理的好友请求

需要基于另一张桌子的所有进出时间?

用 Selenium 刮一张桌子并打印它

SQL TRIGGER 更新时从一张表到另一张表

在一张桌子上比较两个多月之间客户的演变

按另一张桌子的数量排序?