Sql 按列列出的每个多个分组的前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)

OP的原始问题标题:在子查询中使用一个查询中的字段

我在Access中编写查询方面不是很有经验,我遇到了一些麻烦

我有几张桌子。1个用于产品,1个用于市场,1个用于结合市场和产品的事实。我需要编写一个查询,将它们连接在一起,对于特定市场字段MF的每个实例,我需要返回每个市场/产品汇总的特定事实字段FF的第n个最高值,以及它链接到的特定产品字段PF的第n个最高值。希望这是有道理的

无论如何,我的问题是:

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最后做得怎么样了最小化查询中嵌套的、不需要的列的数量可以优化性能。