mysql - 计算多次订购的产品

标签 mysql

我需要获取客户多次订购且仅订购一次的产品的数量。我可能以错误的方式看待这个问题,如果 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/

相关文章:

python - 将数据导入 MySQL 时提高性能?

php - 在一张登录表单上登录两个不同的区域

java - 准备好的语句不起作用,但当 UPDATE 在 mysql 中工作时在终端中写入

mysql - 数据类型 varchar 和 ntext 在 add 运算符中与 hibernate 不兼容

mysql - 进入数据库需要特别注意的符号有哪些

MySQL SELECT 编码问题(可能是西里尔文)

mysql - 从一列中选择多行

mysql - 如何建立具有多个一对多关系的数据库?使用数据透视表或连接表?

mysql - 是否可以模拟MySQL复制SlaveIO和SlaveSQL崩溃来测试监控脚本?

php - Zend_Db : Filter results