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
從第一行除了c.IndustryType'的'刪除一切。同時從GROUP BY子句中刪除'o.orderdate'。 –
發佈你的表格定義和一些與你的問題相關的示例數據集 –
@Paul Spiegel,好吧,但我不明白爲什麼它會打破我的結果,並且可以在結果中顯示所有字段ID,名稱,城市等? – Ninja2k