2017-09-03 47 views
1

我正在嘗試編寫一個SQL查詢,它將返回每個公司和每個位置的頂級項目。我有一個例子MySQL表(TABLE_X),看起來像這樣:MySQL基於多個分組中的計數的頂部項目

Date  | Company | Location | Item   | Price | Quantity | Total_Amount 
----------|---------|----------|--------------|-------|----------|------------- 
1/10/2000 | ABC  | 1  | Food   | 2  | 6  | 12  
1/11/2000 | ABC  | 1  | Food   | 1  | 2  | 2 
1/12/2000 | ABC  | 2  | Food   | 10 | 5  | 50  
1/13/2000 | ABC  | 2  | Electronics | 100 | 2  | 200 
1/10/2000 | ABC  | 1  | Consumables | 10 | 5  | 50  
1/15/2000 | ABC  | 2  | Electronics | 100 | 3  | 300 
1/10/2000 | DEF  | 1  | Electronics | 50 | 5  | 250  
1/16/2000 | DEF  | 1  | Electronics | 50 | 4  | 200 
1/19/2000 | DEF  | 2  | Food   | 10 | 5  | 50  
1/14/2000 | DEF  | 2  | Food   | 2  | 10  | 20 
1/11/2000 | DEF  | 2  | Food   | 5  | 8  | 40  
1/11/2000 | DEF  | 2  | Electronics | 500 | 2  | 1000 

再舉例來說,我要的是回到是每個位置每個公司計頂部的項目。所以像這樣的情況下,每個公司和每個位置的計數最高的項目。

Company | Location | Item  | AVG(Price) | SUM(Total_Amount) | COUNT(*) 
--------|----------|-------------|------------|-------------------|--------- 
ABC  | 1  | Food  | 4   | 14    | 2 
ABC  | 2  | Electronics | 100  | 500    | 2 
DEF  | 1  | Electronics | 50   | 450    | 2 
DEF  | 2  | Food  | 5.67  | 110    | 3 

我知道如何做到這一點在所有的公司和地點,但有麻煩通過計數獲得最高的項目是每一個具體的分組內。理想情況下,如果可能的話我有更多的項目類型,我希望能夠將其擴展到前N個項目。

這是我運行的基於事件生成頂級項目的SQL查詢。

SELECT Company, Location, Item, AVG(Price), SUM(Total_Amount), COUNT(*) FROM table_x 
GROUP BY Company, Location, Item 
ORDER BY Company, Location, COUNT(*) desc 
+0

何時是頂級項目?還要添加你已經嘗試過的。 – Jeffrey

+0

嗨傑弗裏,頂級項目是最頻繁發生的一次,無論價格,數量還是總數。因此,在上述我期待的結果示例中,公司ABC和位置1的首選項是食品,因爲它在該組內發生了兩次,而電子產品和消耗品只發生過一次。我編輯添加了我運行的查詢,但只根據整個數據集的計數給予了我最重要的項目。如果這是合理的話,就會失去在哪裏完善語句以在分組內完成此操作。 – Quest

回答

1

使用MySQL的非標準的分組功能:

select * from (
    SELECT Company, Location, Item, AVG(Price), SUM(Total_Amount), COUNT(*) FROM table_x 
    GROUP BY Company, Location, Item 
    ORDER BY Company, Location, COUNT(*) desc 
) 
group by 1,2 

隨着MySQL的(只)當你忽略的名單選自非聚合列,則返回第一行上的每個組合。

請注意,從版本5.7.5開始,您必須禁用默認情況下啓用的ONLY_FULL_GROUP_BY


@Jeffrey慷慨提供的SQLFiddle

+1

你打我2分鐘...這是[SQL小提琴](http://sqlfiddle.com/#!9/36ee39/25) – Jeffrey

+0

@jeff謝謝。我認爲SQLFiddle已經死了。大約一年沒有工作。很高興看到它回來了。 – Bohemian

+0

這看起來不錯!但是如果我想包含聚合列,會發生什麼情況。查詢將如何改變? – Quest