2016-03-06 39 views
-1

我已經嘗試了很多次而沒有成功。SQL需要分組,但我不知道它是如何應用的

的問題是

  • 列出客戶ID爲已放置2個或更多的訂單在2014年
  • 我的回答是

    安大略客戶
    SELECT Customer.CustId 
    FROM Customer 
        INNER JOIN Orders ON Customer.CustId = Orders.CustId 
    WHERE (Prov = 'ON' AND YEAR(Orders.OrderDate) = '2014') 
    HAVING COUNT (Orders.CustId) > 2; 
    

    但我不斷收到一個錯誤,因爲沒有group by子句,但我沒有得到在答案中播放的位置。

    附件是物理模式

    http://imgur.com/hbosBDM

    +0

    可以用當前格式回答問題(編輯後),但最好將表格模式作爲文本而不是圖像。對於更復雜的問題,如果我們能夠真正測試查詢(創建表,運行腳本),您會收到更好的答案。 – Alexei

    回答

    0

    HAVING僅在與GROUP BY結合使用。只需包含COUNT(...)> 2作爲WHERE子句的一部分即可。分組(GROUP BY)時

    SELECT Customer.CustId 
    FROM Customer 
        INNER JOIN Orders ON Customer.CustId = Orders.CustId 
    WHERE (Prov = 'ON' AND YEAR(Orders.OrderDate) = '2014') AND COUNT (Orders.CustId) > 2; 
    
    0

    錯誤是有道理的,因爲HAVING子句僅適用於:所以您的查詢會是什麼樣子。應工作查詢的一個版本是這樣的:

    SELECT Customer.CustId, COUNT(1) Cnt 
    FROM Customer C 
        INNER JOIN Orders O ON C.CustId = O.CustId 
    GROUP BY C.CustId 
    WHERE Prov = 'ON' AND YEAR(Orders.OrderDate) = 2014 
    HAVING COUNT (1) > 2; 
    

    要優化一點點,你應該避免在條件標量函數,因爲在該列任何索引無法使用:

    SELECT Customer.CustId, COUNT(1) Cnt 
    FROM Customer C 
        INNER JOIN Orders O ON C.CustId = O.CustId 
    GROUP BY C.CustId 
    WHERE Prov = 'ON' AND (Orders.OrderDate BETWEEN '20140101' AND '20141231') 
    HAVING COUNT(1) > 2; 
    
    0
    SELECT Customer.CustId 
    FROM Customer 
        INNER JOIN Orders ON Customer.CustId = Orders.CustId 
    WHERE (Prov = 'ON' AND YEAR(Orders.OrderDate) = 2014) 
    GROUP BY Customer.CustId --<-- you need to add this group by here 
    HAVING COUNT (Orders.CustId) > 2; 
    
    相關問題