Access (一般機能)

Accessの一般機能に関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Pro : Access 2010)
クエリでの抽出条件
投稿日時: 21/08/25 10:19:54
投稿者: ラングドシャ

よろしくお願いいたします。
 
品番、発注個数、単価 の入ったテーブル「T_商品単価」があります。
これを絞り込みたいのですが、抽出条件でつまづきうまく抽出できません。
品番が同じで発注個数が違うのに単価が同じという場合があります。これを表示しないようにしたいのです。
 

品番	発注個数  単価
AAAA	   0	  1000
AAAA	1000    1000
BBBB	   0	  1000
BBBB	1000	   800
CCCC	   0	   800
CCCC	 500	   700
CCCC	 800	   500

 
上表の場合、品番AAAAを表示しないようにしたいのですが、"発注個数が違うが単価が同じ"という条件が分からず質問させていただきました。
サイトの検索もしてみたのですが、検索ワードをどのようにしたらよいのか? 希望の内容をヒットさせることができませんでした。
 
どのように抽出条件を設定すればよいでしょうか?よろしくお願いいたします。

回答
投稿日時: 21/08/25 11:26:46
投稿者: mayu.

引用:
品番が同じで発注個数が違うのに単価が同じという場合があります。
これを表示しないようにしたいのです。

テーブル: T_商品単価
 
ID	品番	発注個数	単価
--------------------------------------
1	AAAA	0	1000
2	AAAA	1000	1000
3	BBBB	0	1000
4	BBBB	1000	800
5	CCCC	0	800
6	CCCC	500	700
7	CCCC	800	500
8	CCCC	200	500

とあった場合、
 
品番 CCCC の扱いがどうなるのか
ちょっとわかりませんでしたので
2種類の SQL を載せておきます。
 
■ CCCC 全行を非表示にする場合
 
SELECT * FROM T_商品単価
WHERE 品番 NOT IN
(
    SELECT 品番
    FROM   T_商品単価
    GROUP BY 品番
           , 単価
    HAVING Min( 発注個数 ) < Max( 発注個数 )
)

■ ID が 5, 6 の CCCC は表示、
     7, 8 の CCCC は非表示 とする場合
 
SELECT * FROM T_商品単価 x
WHERE EXISTS
(
    SELECT 1
    FROM   T_商品単価 y
    WHERE y.品番 = x.品番
      AND y.単価 = x.単価
    HAVING Min( 発注個数 ) = Max( 発注個数 )
)

投稿日時: 21/08/25 11:50:01
投稿者: ラングドシャ

mayu.様
早速、ご回答いただきましてありがとうございます。
mayu.様がご提示くださったサンプルの例を忘れていました。
私の条件記載ミスで申し訳ありませんが、再度教えていただけますか?
 
テーブル: T_商品単価
 

ID	品番	発注個数	単価
--------------------------------------
1	AAAA	0	  1000
2	AAAA	1000	  1000
3	BBBB	0	  1000
4	BBBB	1000	  800
5	CCCC	0	  800
6	CCCC	500	  700
7	CCCC	800	  500
8	CCCC	200	  500

 
上表の場合、AAAAを非表示に。
BBBB,CCCCは全件数表示したい。
 
AAAAのように、発注個数が二種類で、単価が同じものを非表示にしたいです。
この場合、発注個数がどんな数字であっても単価が同じならば非表示にしたいです。
それ以外の場合は全件表示したいです。
 
せっかくご回答くださったのにすみません。
よろしくお願いいたします。

回答
投稿日時: 21/08/25 12:20:07
投稿者: mayu.

引用:

AAAAのように、発注個数が二種類で、単価が同じものを非表示にしたいです。
この場合、発注個数がどんな数字であっても単価が同じならば非表示にしたいです。
それ以外の場合は全件表示したいです。

なるほど。
それでは、以下のような感じでいかがでしょう。
 
■ サブクエリ版 ( 更新可能な結果セットならこちら )
 
SELECT * FROM T_商品単価
WHERE 品番 NOT IN
(
    SELECT 品番
    FROM 
    (
        SELECT DISTINCT 品番, 発注個数, 単価
        FROM T_商品単価
    ) q
    GROUP BY 品番
    HAVING Count(1) = 2
       AND Min( 単価 ) = Max( 単価 )
       AND Min( 発注個数 ) < Max( 発注個数 )
);

■ 外部結合版 ( 速度重視ならこちら )
 
SELECT x.* FROM T_商品単価 x
LEFT JOIN
(
    SELECT 品番
    FROM 
    (
        SELECT DISTINCT 品番, 発注個数, 単価
        FROM T_商品単価
    ) q
    GROUP BY 品番
    HAVING Count(1) = 2
       AND Min( 単価 ) = Max( 単価 )
       AND Min( 発注個数 ) < Max( 発注個数 )
) y
ON x.品番 = y.品番
WHERE y.品番 Is Null ;

投稿日時: 21/08/25 13:32:43
投稿者: ラングドシャ

mayu.様
 
詳しくないのですがサブクエリ版のほうがなんとなくわかりやすかったので、そちらを利用させていただき、無事抽出することができました。
 
質問に不備があったのに回答いただきまして感謝です。
ありがとうございました。