3

OPの元の質問タイトル:サブクエリで1つのクエリのフィールドを使用する

私はAccessでクエリを作成した経験があまりなく、問題が発生しています。

私はいくつかのテーブルを持っています。1つは製品用、1つは市場用、1つは市場と製品を組み合わせたファクト用です。それらを結合できるクエリを作成する必要があり、特定の市場フィールド(MF)のすべてのインスタンスについて、特定のファクトフィールド(FF)のn番目に高いもの(市場/製品ごとに合計)を返す必要があります。リンク先のファクト値である特定の製品フィールド(PF)。それが理にかなっていることを願っています。

とにかく、これが私が持っているクエリです:

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

TOP 2の部分は、nを簡単に指定できる場所です。私が抱えている問題は、これをアクセスで実行すると、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
4

2 に答える 2

1

この参照を見てください:

市場だけで合計をクエリ:

マーケット別の結果合計:

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

マーケット、カテゴリ別クエリ合計:

select m.mf2, p.pf10, p.pf5, 
group_concat(f.product_id)as prods, 
m.item_id , sum(f.ff3) as sff
from mmarket m
left join mfact f
on m.item_id = f.market_id
inner join mproduct p
on f.product_id = p.item_id
group by m.mf2, p.pf10
order by 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の後のコメントに従って更新された回答

クエリ:

select x.*
from (
select m.mf2, p.pf10, sum(f.ff3) as sff
from mmarket m
left join mfact f
on m.item_id = f.market_id
inner join mproduct p
on f.product_id = p.item_id
group by m.mf2, p.pf10
  order by sff desc ) as x
limit 1
;

結果:

MF2     PF10          MSFF
28      Category2     2500

OP の期待される結果に基づく - MS ACCESS SQL に準拠するように更新

MYSQL でこれを実現する方法はたくさんあります。ただし、OPにMS ACCESSの回答を提供したかった.

上記の **市場別合計、カテゴリ** クエリからの結果を一時テーブルまたは MS ACCESS クエリに保存することをお勧めします。次に、そのクエリを最終クエリで使用します。

カテゴリ別市場別トップ 1 のクエリ:

-- success final :) by Top 1st
select x.mf2, x.pf10, x.sff
from 
(select m.mf2, p.pf10, p.pf5, 
group_concat(f.product_id)as prods, 
m.item_id , sum(f.ff3) as sff
from mmarket m
left join mfact f
on m.item_id = f.market_id
inner join mproduct p
on f.product_id = p.item_id
group by m.mf2, p.pf10
order by sff desc) as x

where 

(select count(*)
 from
     (select m.mf2, p.pf10, p.pf5, 
      group_concat(f.product_id)as prods, 
      m.item_id , sum(f.ff3) as sff
      from mmarket m
      left join mfact f
      on m.item_id = f.market_id
      inner join mproduct p
      on f.product_id = p.item_id
      group by m.mf2, p.pf10
      order by sff desc) as y

where y.sff >= x.sff
and y.mf2 = x.mf2) =1 //-- Top 3rd, 2nd, 1st
order by x.sff desc
;

カテゴリ別のトップ 1 市場の結果:

MF2     PF10    SFF
28  Category2   2500
64  Category1   2000
73  Category2   2000

カテゴリ別上位第 2 市場の結果:

MF2     PF10    SFF
28  Category1   1500
64  Category3   1500
73  Category1   1000

カテゴリ別上位 3 番目の市場の結果:

MF2     PF10    SFF
64  Category2   500
73  Category3   500
于 2012-12-06T09:01:26.820 に答える
1

わかりました、よく考えて遊んだ後、正しい結果を得る方法を見つけました。唯一の問題は、時間がかかることです。ランキング = 1 が最大の事実値、2 が 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

最初に最も内側のクエリを一時テーブルに書き出してから、このクエリを実行する必要があることはわかっています。まったく同じクエリが 2 回必要になるからです。それとは別に、誰かがこれを行うためのより良い方法またはクエリを高速化する方法を考えることができれば. それは素晴らしいでしょう:)

助けてくれてありがとう、bonCodigo :)

于 2012-12-06T13:57:42.577 に答える