我需要获取客户多次订购且仅订购一次的产品的数量。我可能以错误的方式看待这个问题,如果 sql 看起来很愚蠢或其他什么,请原谅我。
SELECT ActualOrder.Sku,
COUNT(DISTINCT Email) AS UniqueCustomer,
COUNT(DISTINCT OrderNumber) AS NumOrders,
COUNT(Reordered.Sku) AS NumReordered,
COUNT(OrderedOnce.Sku) AS NumOrderedOnce
FROM ActualOrder
LEFT JOIN (SELECT Sku FROM ActualOrder GROUP BY Email HAVING COUNT(DISTINCT OrderNumber) > 1) AS Reordered ON ActualOrder.Sku = Reordered.Sku
LEFT JOIN (SELECT Sku FROM ActualOrder GROUP BY Email HAVING COUNT(DISTINCT OrderNumber) = 1) AS OrderedOnce ON ActualOrder.Sku = OrderedOnce.Sku
GROUP BY ActualOrder.Sku
根据 John Woo 从子查询中获取计数的想法,我想出了这段代码,它实际上确实有效,但有点嵌套。也许你们可以帮助我提高效率或至少缩短时间。再次感谢您的帮助!
SELECT ActualOrder.Sku,
COUNT(DISTINCT Email) AS UniqueCustomer,
COUNT(DISTINCT OrderNumber) AS NumOrders,
NumReordered,
NumOrderedOnce
FROM ActualOrder
LEFT JOIN (SELECT Sku, SUM(IF(NumCustomerOrders>1,1,0)) AS NumReordered, SUM(IF(NumCustomerOrders=1,1,0)) AS NumOrderedOnce
FROM (SELECT Sku, Email, COUNT(DISTINCT OrderNumber) AS NumCustomerOrders
FROM ActualOrder GROUP BY Sku, Email)
AS Orders GROUP BY Sku) AS OrderCount ON ActualOrder.Sku = OrderCount.Sku
GROUP BY ActualOrder.Sku
最佳答案
您可以在子查询
上统计订单总数
SELECT ActualOrder.Sku,
Reordered.NumReordered,
OrderedOnce.NumOrderedOnce
COUNT(DISTINCT Email) AS UniqueCustomer,
COUNT(DISTINCT OrderNumber) AS NumOrders
FROM ActualOrder
LEFT JOIN
(
SELECT Sku, COUNT(*) NumReordered
FROM ActualOrder
GROUP BY Email
HAVING COUNT(*) > 1
) AS Reordered ON ActualOrder.Sku = Reordered.Sku
LEFT JOIN
(
SELECT Sku, COUNT(*) NumOrderedOnce
FROM ActualOrder
GROUP BY Email
HAVING COUNT(*) = 1
) AS OrderedOnce ON ActualOrder.Sku = OrderedOnce.Sku
GROUP BY ActualOrder.Sku,
Reordered.NumReordered,
OrderedOnce.NumOrderedOnce
关于mysql - 计算多次订购的产品,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12256365/