我想创建一个SQL查询,列出所有订单数量高于平均水平的客户

我想创建一个SQL查询,列出所有订单数量高于平均水平的客户,sql,oracle,join,Sql,Oracle,Join,SQL查询所有下订单数量高于平均值的客户的列表 订单详细信息显示在NW_订单表中,客户信息显示在NW_客户表中 首先,我计算了所有客户下订单的平均数量。然后我只想拉下订单数量大于平均订单数量的客户 我的问题是: SELECT C.customerid, C.companyname, COUNT(O.orderid) AS cnt FROM NW_customers C LEFT JOIN NW_orders O ON O.customerID = C.Custome

SQL查询所有下订单数量高于平均值的客户的列表

订单详细信息显示在NW_订单表中,客户信息显示在NW_客户表中

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

我的问题是:

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”:无效标识符


有人能帮忙纠正错误吗

使用通用表表达式:

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)
如果要引入实际的客户信息,可以向上述查询添加联接:

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

使用公共表表达式:

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)
如果要引入实际的客户信息,可以向上述查询添加联接:

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,抛开不使用分析功能不谈,
NW_客户
如果您只想检索
customerid
,根本不需要,因为只有有订单的客户可能下了高于平均数的订单。Tim,抛开不使用分析功能不谈,如果您希望仅检索
customerid
,则根本不需要
NW_客户
,因为只有有订单的客户可能下了高于平均水平的订单。
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
;