2011-07-04 4 views
1

を必要なサンプルデータは、私は上記の表を返すクエリを持ってアクセスフィルタは、ここで

----------------------------------------------------------------------------------------- 
id nameid name  score   diff   include  quantity  grade 
--------------------------------------------------------------------------------------- 

7  0002  MO   10   0    0   25   3 
8  0002  MO   18   0    1   25   3 
9  0002  MO   20   0    0   25   3 
10 0002  MO   14   0    0   17   6 
11 0002  MO   100   0    0   17   6 
11 0002  MO   100   0    0   17   6 

12 0003  MA   10   0    0   12   3 
13 0003  MA   18   0    0   12   3 
14 0003  MA   20   0    0   12   3 
15 0003  MA   14   0    0   25   6 
16 0003  MA   100   0    1   25   6 
17 0003  MA   100   0    0   25   6 

12 0004  MB   10   0    0   12   3 
13 0004  MB   18   0    1   12   3 
14 0004  MB   20   0    0   12   3 
15 0004  MB   14   0    0   07   6 
16 0004  MB   100   0    1   07   6 
17 0004  MB   100   0    0   07   6 

を設定しています。 6つの各グループでは、少なくともの値を持つ行がincludeの列になることに注意してください。 ref:access query neededを参照してください(必要ありません)。

また、6つのグループごとに、grade = 3の3つの行と、grade = 6の3つの行があります。 また、対応して、grade 3grade 6は、同じグループ内の数量を持っています。

私がやりたいことは、15個以下のすべての行を除外することです。

: はしかし、私はまだ私は上記のデータから、グレード3と6の両方のための両方 quantity < 15を持っている「グループ」を削除する6.

によってそれらをグループにしたい を設定し、私は次のような結果をwwant

----------------------------------------------------------------------------------------- 
id nameid name  score   diff   include  quantity  grade 
--------------------------------------------------------------------------------------- 

7  0002  MO   10   0    0   25   3 
8  0002  MO   18   0    1   25   3 
9  0002  MO   20   0    0   25   3 
10 0002  MO   14   0    0   17   6 
11 0002  MO   100   0    0   17   6 
11 0002  MO   100   0    0   17   6 

12 0003  MA   10   0    0   12   3 
13 0003  MA   18   0    0   12   3 
14 0003  MA   20   0    0   12   3 
15 0003  MA   14   0    0   25   6 
16 0003  MA   100   0    1   25   6 
17 0003  MA   100   0    0   25   6 

基本的に、6つのグループにいずれかの行にinclude = 1があり、グレード3または6のいずれかの場合は、グループ全体が必要です。

+0

カラム 'nameid'は最大6つの同じ名前を持つことができます。 – masfenix

+0

私はそれがうまくいくと思うのですが、私は – masfenix

答えて

1

「だから、基本的に6のグループは、私は、グループ全体をしたい任意の行に= 1を含み、そして> 15のいずれかのグレード3又は6量有する場合

私の推測では、このクエリを識別しています候補名前IDグループ:

SELECT DISTINCT nameid 
FROM YourTable 
WHERE 
    include = 1 
    AND quantity > 15 
    AND (grade = 3 OR grade = 6); 

私が正しく推測する場合は、別のクエリとして保存、またはサブクエリとしてそれを使用し、INNER行を制限するYourTableにそれを参加することができますが名前IDが出会う場所のみに戻りましたあなたの基準。

SELECT y.id, y.nameid, y.[name], y.score, y.diff, y.include, y.quantity, y.grade 
FROM 
    YourTable AS y 
    INNER JOIN [ 
     SELECT DISTINCT nameid 
     FROM YourTable 
     WHERE 
      include = 1 
      AND quantity > 15 
      AND (grade = 3 OR grade = 6) 
     ]. AS q 
     ON y.nameid = q.nameid 
ORDER BY y.nameid; 

編集:それは、このテストされていないSELECT文に近くなります。お持ちでない場合は名前IDにインデックスを追加します。

+0

の前にしなければならないいくつかのコラムを編集しました。それだけでQAをする必要があります。しかし、それは少し遅いです。私はテーブルにインデックスを追加することはできません..テーブル自体が別のクエリであるためです。 – masfenix

+0

実用的な解決法が他にない場合は、これらのDISTINCTのnameid値を保持する補助テーブルを作成することを検討してください。あなたは、その1つのクエリを "追加クエリ"に変換することができます... INSERT INTO AuxTable(nameid)SELECT DISTINCTから名前をつけます。YourTable ... 'INNERは、AuxTable ON nameidでYourTableをジョインします。そのアプローチは私の最初の選択ではありませんが、パフォーマンスが十分に向上し、より良い方法を見つけることができない場合は、試してみてください。 :-) – HansUp