2017-10-21 39 views
0

我需要得到平均值,最小值和最大值,是從數據集中的每個行業類型。當我使用MIN,MAX,AVG函數時,它只返回與「金額」列相同的值。我如何獲得MIN,MAX,AVG與innerjoin一起工作?

我嘗試

SELECT c.Custid, c.Cname, c.City, c.IndustryType, o.OrderNo, o.OrderDate, o.SalesPersonID, o.Amount, 
AVG(o.Amount) AS 'Average Amount', 
MIN(o.Amount) AS 'Minimum Amount', 
MAX(o.Amount) AS 'Maximum Amount' 
FROM customer c 
INNER JOIN orders o 
ON c.custid = o.custid 
GROUP BY c.IndustryType,o.orderdate; 
+1

從第一行除了c.IndustryType'的'刪除一切。同時從GROUP BY子句中刪除'o.orderdate'。 –

+0

發佈你的表格定義和一些與你的問題相關的示例數據集 –

+0

@Paul Spiegel,好吧,但我不明白爲什麼它會打破我的結果,並且可以在結果中顯示所有字段ID,名稱,城市等? – Ninja2k

回答

0

SQL標準規定,一個GROUP BY子句包含那些使用aggregate function(即MIN(),MAX(),AVG()等所有列)。

SQL92和更早版本不允許爲其選擇列表, HAVING條件,或ORDER BY列表,請參閱該 未在GROUP BY子句中命名非聚合列的查詢。然而 https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html

MySQL的執行額外的能力GROUP BY這是非標準的,而在舊版本的MySQL它默認爲不規範的做法。 (有一個服務器設置,您可以更改爲從標準語法翻轉到非標準語法進行分組。)從MySQL 5.7.5開始,默認設置更改爲SQL標準方法。

MySQL的5.7.5和高達工具檢測功能的依賴。如果 的ONLY_FULL_GROUP_BY SQL模式被激活(這是默認設置), MySQL的拒絕爲其選擇列表,HAVING條件,或 ORDER BY列表指的是在 既不名爲GROUP BY子句也不非聚合列的查詢在功能上依賴於它們。

參見:ONLY_FULL_GROUP_BY

幾乎可以肯定你的原始查詢沒有工作是基於上述考慮的原因。許多人會告訴你,使用不規範的做法是不良做法,實際上如果你研究的主題的更多,你將瞭解到的非標準方法將返回所有這些不包含在GROUP BY子句中的列「不確定的結果」(除在罕見的情況下)。你一直使用標準方法要好得多。例如

SELECT 
     c.IndustryType 
    , o.OrderDate 
    , AVG(o.Amount) AS "Average Amount" 
    , MIN(o.Amount) AS "Minimum Amount" 
    , MAX(o.Amount) AS "Maximum Amount" 
FROM customer c 
INNER JOIN orders o ON c.custid = o.custid 
GROUP BY 
     c.IndustryType 
    , o.OrderDate 
; 

OR

SELECT 
     c.Custid 
    , c.Cname 
    , c.City 
    , c.IndustryType 
    , o.OrderNo 
    , o.OrderDate 
    , o.SalesPersonID 
    , o.Amount 
    , AVG(o.Amount) AS "Average Amount" 
    , MIN(o.Amount) AS "Minimum Amount" 
    , MAX(o.Amount) AS "Maximum Amount" 
FROM customer c 
INNER JOIN orders o ON c.custid = o.custid 
GROUP BY 
     c.Custid 
    , c.Cname 
    , c.City 
    , c.IndustryType 
    , o.OrderNo 
    , o.OrderDate 
    , o.SalesPersonID 
    , o.Amount 
; 

值得一提的是,你的原始查詢似乎要爲每一個獨特的組合計算的合計(IndustryType &訂購日期),但在幾個行重複那些聚集的細節。還有「窗口功能」,允許這種情況出現正在開發並打算與MySQL 8.x的發佈,在其他數據庫中已經存在,例如DB2,甲骨文,SQL服務器,Postgre,SQL精簡版,MariaDB的這些功能(和更多)。

的語法窗口彙總如下:

SELECT 
     c.Custid 
    , c.Cname 
    , c.City 
    , c.IndustryType 
    , o.OrderNo 
    , o.OrderDate 
    , o.SalesPersonID 
    , o.Amount 
    , AVG(o.Amount) OVER(PARTITION BY c.IndustryType, o.OrderDate) 
     AS "Average Amount" 
    , MIN(o.Amount) OVER(PARTITION BY c.IndustryType, o.OrderDate) 
     AS "Minimum Amount" 
    , MAX(o.Amount) OVER(PARTITION BY c.IndustryType, o.OrderDate) 
     AS "Maximum Amount" 
FROM customer c 
INNER JOIN orders o ON c.custid = o.custid 
相關問題