2012-05-21 15 views
2

我試着這樣做:需要提示上看似簡單的SQL查詢

SELECT c.id, c.name, COUNT(orders.id) 
FROM customers c 
JOIN orders o ON o.customerId = c.id 

但是,SQL不會允許COUNT函數。執行過程中出現的錯誤是,c.Id在選擇列表中無效,因爲它不在group by子句中,或者未被聚合。

我想我知道這個問題,COUNT只是統計了全部表中的行數orders。我怎樣才能爲每個客戶計數?

編輯

全面查詢,但它在荷蘭的...這是我的嘗試:

select k.ID, 
     Naam, 
     Voornaam, 
     Adres, 
     Postcode, 
     Gemeente, 
     Land, 
     Emailadres, 
     Telefoonnummer, 
     count(*) over (partition by k.id) as 'Aantal bestellingen', 
     Kredietbedrag, 
     Gebruikersnaam, 
     k.LeverAdres, 
     k.LeverPostnummer, 
     k.LeverGemeente, 
     k.LeverLand 
from klanten k 
    join bestellingen on bestellingen.klantId = k.id 

沒有錯誤,但沒有結果要麼..

+4

您需要在查詢結尾處使用「GROUP BY c.id,c.name」。 –

+0

您還在'orders'表上缺少別名(上面的查詢無法編譯)。這導致所有的答案都有無效的語法。 –

+0

@AaronBertrand這是無意的,現在修復。 – MarioDS

回答

2

如果你真的希望能夠選擇所有Customers列而不指定名稱(原因來避免這種please read this blog post in full,易變通方法),那麼你就可以做到這一點懶縮寫來代替:

;WITH o AS 
(
    SELECT CustomerID, CustomerCount = COUNT(*) 
    FROM dbo.Orders GROUP BY CustomerID 
) 
SELECT c.*, o.OrderCount 
FROM dbo.Customers AS c 
INNER JOIN dbo.Orders AS o 
ON c.id = o.CustomerID; 

編輯您真正的查詢

SELECT 
    k.ID, 
    k.Naam, 
    k.Voornaam, 
    k.Adres, 
    k.Postcode, 
    k.Gemeente, 
    k.Land, 
    k.Emailadres, 
    k.Telefoonnummer, 
    [Aantal bestellingen] = o.klantCount, 
    k.Kredietbedrag, 
    k.Gebruikersnaam, 
    k.LeverAdres, 
    k.LeverPostnummer, 
    k.LeverGemeente, 
    k.LeverLand 
FROM klanten AS k 
INNER JOIN 
(
    SELECT klantId, klanCount = COUNT(*) 
    FROM dbo.bestellingen 
    GROUP BY klantId 
) AS o 
ON k.id = o.klantId; 

我認爲這個解決方案是多少比所有列的分組更清潔。先在訂單表上分組然後再加入一次到每個客戶行可能比先聯合然後分組效率更高。

+0

謝謝,這個工作非常好,它是一個非常整潔的查詢。 – MarioDS

5

當使用聚合函數一樣那麼,您需要按任何非聚合的列進行分組:

SELECT c.id, c.name, COUNT(orders.id) 
FROM customers c 
JOIN orders o ON o.customerId = c.id 
GROUP BY c.id, c.name 
+0

+1 2分鐘打敗我。 :( –

+0

是否真的有必要?是否有其他方式?我不能這樣做,因爲我選擇了幾乎所有的列,當我將它們全部添加到分組時,查詢不會再返回任何內容 – MarioDS

+0

@Mario然後發佈您的整個查詢,一些示例數據和所需的結果輸入所有列應該不是問題 - 您可以簡單地將「列」節點從對象資源管理器拖到查詢窗口中,但是您需要更好地定義您的查詢實際上應該會返回 –

1

以下將統計每個客戶的訂單,而不需要按照customer.id對整體查詢進行分組。但這也意味着對於有多個訂單的客戶,每個訂單都會重複該數量。

SELECT c.id, c.name, COUNT(orders.id) over (partition by c.id) 
FROM customers c 
    JOIN orders ON o.customerId = c.id 
+0

「計數將重複每個訂單。」如何解決呢? – MarioDS

+0

@MarioDeSchaepmeester:那麼你需要一個'group by',如其他答案所示 –