簡體   English   中英

我想創建一個SQL查詢來列出所有下單數量高於平均水平的所有客戶

[英]I wanted to create a SQL query to list of all customers who have placed an above average number of orders

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”:無效的標識符

誰能幫助糾正錯誤?

使用公用表表達式:

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)

這是解析函數的經典。

cutomerId

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
;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM