2017-07-17 107 views
-1

我正在嘗試查找訂單數量高於平均水平的國家/地區。這是我得到的。問題是(見圖片)的訂單的每個國家的計數是關閉的,因爲它應該是給大家返回高於平均水平的行

SELECT avg(NumberOrders) as avg, 
     Customers.Country, 
     NumberOrders 
    FROM Customers, 
      (SELECT COUNT(Orders.OrderId) AS NumberOrders 
      FROM Customers JOIN 
        Orders ON Customers.CustomerID = Orders.CustomerID 
     GROUP BY Customers.Country) nested 
GROUP BY Customers.Country 
    HAVING NumberOrders > avg; 

Output

+2

什麼是你的DBMS? – dnoeth

+0

我正在使用數據庫瀏覽器的sqlite。 – Jako

+0

該數據庫是northwind – Jako

回答

1

不同。如果你的DBMS支持窗聚集(幾乎所有的除了MySQL的&訪問):

select * 
from 
(
    SELECT Customers.Country, 
     COUNT(Orders.OrderId) AS NumberOrders, -- count per country 
     AVG(COUNT(Orders.OrderId)) OVER() AS avgOrders -- average count 
    FROM Customers 
    JOIN Orders 
    ON Customers.CustomerID = Orders.CustomerID 
    GROUP BY Customers.Country 
) nested 
WHERE NumberOrders > avgOrders 

編輯:

對於沒有的DBMS蘇pporting 窗聚集它的方式更加複雜:

SELECT Customers.Country, 
    COUNT(Orders.OrderId) AS NumberOrders -- count per country 
FROM Customers 
JOIN Orders 
    ON Customers.CustomerID = Orders.CustomerID 
GROUP BY Customers.Country 
HAVING COUNT(Orders.OrderId) > 
(select avg(NumberOrders) 
    from 
    (
     SELECT Customers.Country, 
     COUNT(Orders.OrderId) AS NumberOrders -- count per country 
     FROM Customers 
     JOIN Orders 
     ON Customers.CustomerID = Orders.CustomerID 
     GROUP BY Customers.Country 
    ) AS dt 
) 

如果DBMS支持公用表表達式這可以簡化爲:

with cte as 
(
    SELECT Customers.Country, 
     COUNT(Orders.OrderId) AS NumberOrders -- count per country 
    FROM Customers 
    JOIN Orders 
    ON Customers.CustomerID = Orders.CustomerID 
    GROUP BY Customers.Country 
) 
select * 
from cte 
WHERE NumberOrders > 
(
    select avg(NumberOrders) from cte 
) 
+0

你沒有使用過窗口。 –

+0

@MatthewWhited:Ups,忘了'OVER()',謝謝 – dnoeth

+0

非常感謝您的輸入!不幸的是,似乎有一個語法錯誤,我不能完全弄清楚在哪裏 – Jako