我正在尝试编写一个SQL查询,它将返回每个公司和每个位置的顶级项目。我有一个示例MySQL表(table_x),如下所示:
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 :(得分: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
,默认情况下已启用。