【问题标题】:I wanted to create a SQL query to list of all customers who have placed an above average number of orders我想创建一个 SQL 查询来列出所有订单数量高于平均水平的客户
【发布时间】:2016-12-04 05:44:11
【问题描述】:

SQL 查询列出所有下单数量高于平均水平的客户。

订单详情显示在 NW_orders 表中,客户信息显示在 NW_Customers 表中。

首先,我计算了所有客户的平均订单数。然后我只想拉下订单大于平均订单数的客户。

我的查询:

SELECT 
    C.customerid, C.companyname, COUNT(O.orderid) AS cnt
FROM 
    NW_customers C
LEFT JOIN 
    NW_orders O ON O.customerID = C.Customerid 
GROUP BY 
    C.customerid 
HAVING 
   cnt > (SELECT COUNT(O.OrderID) / COUNT(DISTINCT(c.customerid)) AS Avg
          FROM NW_orders O
          LEFT JOIN NW_customers C ON O.customerID = C.Customerid)

我收到一个错误

ORA-00904:“CNT”:无效标识符

任何人都可以帮助纠正错误吗?

【问题讨论】:

    标签: sql oracle join


    【解决方案1】:

    使用公用表表达式:

    WITH cte AS (
        SELECT o.customerid, COUNT(o.orderid) AS cnt
        FROM NW_orders o
        GROUP BY o.customerid
    )
    
    SELECT t.customerid
    FROM cte t
    WHERE t.cnt > (SELECT AVG(cnt) FROM cte)
    

    如果要引入实际的客户信息,可以在上面的查询中加入join:

    SELECT t1.*, t2.*
    FROM cte t1
    INNER JOIN NW_customers t2
        ON t1.customerid = t2.customerid
    WHERE t1.cnt > (SELECT AVG(cnt) FROM cte)
    

    【讨论】:

    • Tim,撇开不使用分析函数不谈,如果您只想检索customerid,则根本不需要NW_customers,因为只有有订单的客户可能会下达高于平均水平的订单订单数量。
    【解决方案2】:

    这是解析函数的经典之作。

    客户标识

    select      customerID
    
    from       (select      customerID
                           ,count(*)                as customer_orders
                           ,avg  (count(*)) over () as avg_customer_orders
    
                from        NW_orders
    
                group by    customerID
                )
    
    where       customer_orders > avg_customer_orders
    ;
    

    完整的客户信息

    select      *
    
    from        NW_customers
    
    where       customerID in
                (
                    select      customerID
    
                    from       (select      customerID
                                           ,count(*)                as customer_orders
                                           ,avg  (count(*)) over () as avg_customer_orders
    
                                from        NW_orders
    
                                group by    customerID
                                )
    
                    where       customer_orders > avg_customer_orders
                )
    ;
    

    完整的客户信息+订单信息

    select      o.customer_orders
               ,o.avg_customer_orders
               ,c.*
    
    from                    NW_customers    c
    
                join        (select     customerID
                                       ,count(*)                as customer_orders
                                       ,avg  (count(*)) over () as avg_customer_orders
    
                            from        NW_orders
    
                            group by    customerID
                            ) o
    
                on          o.customerID    =
                            c.customerID
    
    
    where       o.customer_orders > o.avg_customer_orders
    ;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-05
      • 2022-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多