Sql 按列列出的每个多个分组的前n个聚合值
OP的原始问题标题:在子查询中使用一个查询中的字段 我在Access中编写查询方面不是很有经验,我遇到了一些麻烦 我有几张桌子。1个用于产品,1个用于市场,1个用于结合市场和产品的事实。我需要编写一个查询,将它们连接在一起,对于特定市场字段MF的每个实例,我需要返回每个市场/产品汇总的特定事实字段FF的第n个最高值,以及它链接到的特定产品字段PF的第n个最高值。希望这是有道理的 无论如何,我的问题是:Sql 按列列出的每个多个分组的前n个聚合值,sql,vba,ms-access,Sql,Vba,Ms Access,OP的原始问题标题:在子查询中使用一个查询中的字段 我在Access中编写查询方面不是很有经验,我遇到了一些麻烦 我有几张桌子。1个用于产品,1个用于市场,1个用于结合市场和产品的事实。我需要编写一个查询,将它们连接在一起,对于特定市场字段MF的每个实例,我需要返回每个市场/产品汇总的特定事实字段FF的第n个最高值,以及它链接到的特定产品字段PF的第n个最高值。希望这是有道理的 无论如何,我的问题是: select market.MF2, product.PF10, sum(fact.FF3)
select market.MF2, product.PF10, sum(fact.FF3) as FF3
from mMarket market, mProduct product, mFact fact
where market.Item_ID = fact.Market_ID
and product.Item_ID = fact.Product_ID
and FF3 =
(
select min(FF3) from
(
select TOP 2 FF3 from
(
select market2.MF2, product2.PF10, sum(fact2.FF3) as FF3
from mMarket market2, mProduct product2, mFact fact2
where market2.Item_ID = fact2.Market_ID
and product2.Item_ID = fact2.Product_ID
and market2.MF2 = market.MF2
group by market2.MF2, product2.PF10
order by 3 DESC
)
)
)
group by market.MF2, product.PF10
前2部分是容易指定n的地方。
我遇到的问题是,当我在access中运行它时,它会提示我输入market.MF2的值。我想这是指子查询中它的实例。
我认为代码会从每一行的主查询中获取该值,但显然不是这样
Tables below:
mMarket
Item_ID MF2
---------------
1 64
2 28
3 73
mProduct
Item_ID PF5 PF10
----------------------------
1 2221 Category1
2 6487 Category3
3 73234 Category2
4 76223 Category1
5 99342 Category2
mFact
Market_ID Product_ID FF3
--------------------------------------
1 1 1000
1 2 1500
1 3 500
1 4 1000
2 1 1500
2 3 1000
2 5 1500
3 1 1000
3 2 500
3 5 2000
这个查询有什么问题?我看不见
提前感谢
预期成果:
If n was 1
MF2 PF10 FF3
----------------------------
64 Category1 2000
28 Category2 2500
73 Category2 2000
If n was 2
MF2 PF10 FF3
----------------------------
64 Category3 1500
28 Category1 1500
73 Category1 1000
请查看此参考资料: 仅按市场查询金额:
MF2 ITEM_ID PRODUCT_ID PF5 PF10 SUM(F.FF3)
28 2 5,1,3 99342 Category2,Category1,Category2 4000
64 1 3,4,1,2 73234 Category2,Category1,Category1,Category3 4000
73 3 1,2,5 2221 Category1,Category3,Category2 3500
仅按市场列出的结果总和:
MF2 ITEM_ID PRODUCT_ID PF5 PF10 SUM(F.FF3)
28 2 5,1,3 99342 Category2,Category1,Category2 4000
64 1 3,4,1,2 73234 Category2,Category1,Category1,Category3 4000
73 3 1,2,5 2221 Category1,Category3,Category2 3500
按市场、类别查询金额:
MF2 PF10 PF5 PRODS ITEM_ID SFF
28 Category2 99342 5,3 2 2500
64 Category1 76223 4,1 1 2000
73 Category2 99342 5 3 2000
28 Category1 2221 1 2 1500
64 Category3 6487 2 1 1500
73 Category1 2221 1 3 1000
64 Category2 73234 3 1 500
73 Category3 6487 2 3 500
选择m.mf2、p.pf10、p.pf5、,
集团公司的产品,
m、 项目编号,sumf.ff3为sff
来自m市场
左连接MFF
在m.item\u id=f.market\u id上
内连接MPProduct p
在f.product\u id=p.item\u id上
m.mf2分组,第pf10页
按sff desc订购
;
按市场、类别划分的结果总和:
MF2 PF10 PF5 PRODS ITEM_ID SFF
28 Category2 99342 5,3 2 2500
64 Category1 76223 4,1 1 2000
73 Category2 99342 5 3 2000
28 Category1 2221 1 2 1500
64 Category3 6487 2 1 1500
73 Category1 2221 1 3 1000
64 Category2 73234 3 1 500
73 Category3 6487 2 3 500
根据OP随后的评论更新了答案
查询:
选择x*
从…起
选择m.mf2、p.pf10、sumf.ff3作为sff
来自m市场
左连接MFF
在m.item\u id=f.market\u id上
内连接MPProduct p
在f.product\u id=p.item\u id上
m.mf2分组,第pf10页
按sff desc as x订购
限制1
;
结果:
MF2 PF10 MSFF
28 Category2 2500
基于OP的预期结果-更新以符合MS ACCESS SQL
在MYSQL中有很多方法可以实现这一点。但是,我想为OP提供MS ACCESS的答案
我建议您将**按市场汇总,类别**查询的上述结果保存到临时表或MS ACCESS查询中。然后在最终查询中使用该查询
按市场和类别查询排名第一的客户:
MF2 PF10 SFF
28 Category2 2500
64 Category1 2000
73 Category2 2000
MF2 PF10 SFF
28 Category1 1500
64 Category3 1500
73 Category1 1000
MF2 PF10 SFF
64 Category2 500
73 Category3 500
-成功决赛:以第一名的成绩
选择x.mf2、x.pf10、x.sff
从…起
选择m.mf2、p.pf10、p.pf5、,
集团公司的产品,
m、 项目编号,sumf.ff3为sff
来自m市场
左连接MFF
在m.item\u id=f.market\u id上
内连接MPProduct p
在f.product\u id=p.item\u id上
m.mf2分组,第pf10页
按sff desc as x订购
哪里
选择计数*
从…起
选择m.mf2、p.pf10、p.pf5、,
集团公司的产品,
m、 项目编号,sumf.ff3为sff
来自m市场
左连接MFF
在m.item\u id=f.market\u id上
内连接MPProduct p
在f.product\u id=p.item\u id上
m.mf2分组,第pf10页
按sff desc as y订购
其中y.sff>=x.sff
y.mf2=x.mf2=1/-排名前三、第二、第一
按x.sff说明订购
;
按类别划分的第一大市场结果:
MF2 PF10 SFF
28 Category2 2500
64 Category1 2000
73 Category2 2000
MF2 PF10 SFF
28 Category1 1500
64 Category3 1500
73 Category1 1000
MF2 PF10 SFF
64 Category2 500
73 Category3 500
按类别划分的排名前二的市场结果:
MF2 PF10 SFF
28 Category2 2500
64 Category1 2000
73 Category2 2000
MF2 PF10 SFF
28 Category1 1500
64 Category3 1500
73 Category1 1000
MF2 PF10 SFF
64 Category2 500
73 Category3 500
按类别划分的前三大市场结果:
MF2 PF10 SFF
28 Category2 2500
64 Category1 2000
73 Category2 2000
MF2 PF10 SFF
28 Category1 1500
64 Category3 1500
73 Category1 1000
MF2 PF10 SFF
64 Category2 500
73 Category3 500
好的,经过深思熟虑,我找到了一种方法来得到正确的结果。唯一的问题是这需要很长时间。我想到了一种方法,为每个市场建立一个排名,排名=1是最大的事实价值,2是第二高的,等等
select StoreCode, Category, Sales, Ranking from
(
select main.MF2 as StoreCode, main.PF10 as Category, main.sFF as Sales,
(
select count(*) from
(
select market.MF2, product.PF10, sum(fact.FF3) as sFF
from mMarket market, mProduct product, mFact fact
where market.Item_ID = fact.Market_ID
and product.Item_ID = fact.Product_ID
group by market.MF2, product.PF10
) as main2
where main.MF2 = main2.MF2
and main2.sFF >= main.sFF
) as ranking
from
(
select market.MF2, product.PF10, sum(fact.FF3) as sFF
from mMarket market, mProduct product, mFact fact
where market.Item_ID = fact.Market_ID
and product.Item_ID = fact.Product_ID
group by market.MF2, product.PF10
) as main
}
where ranking = 1
order by 1,2
我知道我应该首先将最里面的查询写入一个临时表,然后运行这个查询,因为同样的查询需要两次。
除此之外,如果有人能想出一个更好的方法来做这件事或任何加速查询的方法。那太好了:
感谢您的帮助,bonCodigo:主查询可以从子查询中获取值,但不能从其他方式获取值。。。您可以使用一个单独的查询返回market.MF2,并从主查询调用它:您是否有可能向我们展示带有一些示例数据的表模式?哦,好的。我不知道单独的查询位是什么意思根据你的数据,预期的结果是什么Chris?+1我注意到我忘了为你有趣的问题投票了啊,是的,对不起,我弄错了。FF3,应按每个市场的类别进行汇总。然后根据每个市场,得到第n个事实总和最高的类别。因此,当n为1时,它应该是,获得每个市场具有最高FF3值的类别。请您手动记录您的预期结果,我认为这非常有帮助。您可以通过将问题附加到问题末尾来更新问题。e、 g.预期结果。我已将预期结果添加到问题中抱歉,我不在,并且忘记了这里对SQLFIDLE的引用尚未更新:请查看它,并告诉我它是否适合您。我试图用纯sql保存它,就像在MS ACCESS中使用它一样。否则,在MYSQL中使用分区是关键:谢谢,但是不,那没有帮助。我需要有一个记录,每个市场的哪个类别有最高的事实价值
我无法硬编码有多少不同的市场。并且这个查询不允许指定您是否希望每个市场的第三高或第四高,例如join比使用where子句更有效。。。。为什么不将内部查询放在另一个查询中并调用它呢?那么Chris最后做得怎么样了最小化查询中嵌套的、不需要的列的数量可以优化性能。