Access (一般機能)

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

 
(Windows 10 Pro : Access 2016)
フィールドのデータ抽出方法
投稿日時: 19/03/30 16:42:49
投稿者: 水の味

テーブルの、あるフィールドで重複しているデータの重複分を1件だけ残してそれぞれ重複無しでの一覧を
簡単に抽出できる方法はありませんでしょうか。
 
あ い う
1  x  A
2  z  C
3  s  A
4  y  B
5  z  A
6  s  C
7  x  B
8  v  D
9  z  A
10 y  F
  ・
  ・
  ・
「あ」「い」「う」というフィールドがあるとして
「う」のデータの重複無しでABCDFを簡単に抽出するにはどうすればいいでしょうか
ご教示お願いします。

回答
投稿日時: 19/03/30 22:26:16
投稿者: mayu.

引用:

「う」のデータの重複無しでABCDFを簡単に抽出する

単純明快に
    SELECT DISTINCT う FROM テーブル名 ;

「う」がユニークな結果セットになりますけど
これがご希望の結果ではないのでしたら、もう少し詳しく説明しましょう。
例えば
 
  あ   い   う
  --------------------
  11   c    G
  12   z    G
  13   z    G
  14   a    G
 
こういったデータの場合、どの行を抽出したいのでしょうか。
 
単純に「あ」が最大値のデータを表示するのでしたら
14 の行が抽出対象となるでしょうし
そうではなく、
「い」の最大値を抽出対象とするのでしたら 12 と 13 の行が候補になり、
「い」の最大値が複数存在する場合、「あ」は大小どちらの番号を抽出対象とするのでしょうか。
 
なお、今回の例では
14 を抽出するよりも、12 もしくは 13 を抽出するほうが難易度は高いでしょう。

投稿日時: 19/04/01 09:10:26
投稿者: 水の味

mayuさん
おせわになります。
下記コマンドはどこに入力するのでしょうか?
テ-ブル?それとも新規クエリ?
また入力の仕方も分かりませんので
ご教示願います。
 
 『SELECT DISTINCT う FROM テーブル名;』

投稿日時: 19/04/01 09:17:27
投稿者: 水の味

mayuさん
お世話になります
 
  あ   い   う
  --------------------
  11   c    G
  12   z    G
  13   z    G
  14   a    G
   
こういったデータの場合、どの行を抽出したいのでしょうか。
 
「い」のcz aです。
12のzでも13のzでもどちらか一つだけで
cz aを抽出したいのです。
 
よろしくお願いします。

回答
投稿日時: 19/04/01 10:56:17
投稿者: mayu.

引用:
下記コマンドはどこに入力するのでしょうか?
テーブル?それとも新規クエリ?

新規のクエリになります。
 
SQLを入力してクエリを作成する方法は
https://accessvba.blog.so-net.ne.jp/2013-11-11
あたりをご覧いただくとよろしいでしょう。
 
引用:
「い」のcz aです。
12のzでも13のzでもどちらか一つだけで
cz aを抽出したいのです。

SELECT Max( あ ) As あの最大, い, う
FROM テーブル名
GROUP BY い, う 
ORDER BY い, う ;

でよろしいでしょう。
 
なお、SQL文中の テーブル名 はご自身で作成されたものに合わせて
変更するのをお忘れなく。

投稿日時: 19/04/02 21:31:50
投稿者: 水の味

mayuさん
色々とありがとうございます。
 
SQLを入力してクエリを作成する方法は
https://accessvba.blog.so-net.ne.jp/2013-11-11
 
上記サイトを参考にうまくSQLができましたが、
 
SELECT DISTINCT い, う FROM テーブル名 ;
SELECT DISTINCT う, い FROM テーブル名 ;
 
上記で希望近くのものは出来ましたが、
どちらを実行しても一部「う」のフィールドのデータ内に重複しているものが出てきてしまいます。
重複なしでのデータ抽出は無理なのでしょうか
よろしくお願いします。

回答
投稿日時: 19/04/02 23:31:01
投稿者: mayu.

引用:
SELECT DISTINCT い, う FROM テーブル名 ;

「い」と「う」の組み合わせで行をユニークにするという指示ですので
「い」の行や
「う」の行だけで見ると重複は存在します。
 
水の味さんは 2019/04/01 09:17:27 の返信で
 
  あ   い   う
  --------------------
  11   c    G  ※
  12   z    G
  13   z    G  ※
  14   a    G  ※
 
「う」の値は 重複( 同一の値 )しているにもかかわらず、※の行を抽出したいと仰っています。
ところが今回、
 
引用:
どちらを実行しても一部「う」のフィールドのデータ内に
重複しているものが出てきてしまいます。

ということですので、抽出のルール 及び 重複の定義 がはっきりしません。
この二つを明確にした上で
どのような{ 結果 }をご希望なのか、サンプルデータを添えて記載いただけますか。

投稿日時: 19/04/03 09:43:32
投稿者: 水の味

mayuさんお世話になります。
すみません
下記私が最初に出した表の「う」のフィールドにおいての話です
 
あ い う
 1  x  A
 2  z  C
 3  s  A
 4  y  B
 5  z  A
 6  s  C
 7  x  B
 8  v  D
 9  z  A
 10 y  F
  ・
  ・
   ・
「あ」「い」「う」というフィールドがあるとして
「う」のフィールドのデータを重複無しでABCDFを簡単に抽出するにはどうすればいいでしょうか
 ご教示お願いします。
 
mayuさんの表で言うなら
  あ   い   う
  --------------------
  11   c    G
  12   z    G
  13   z    G
  14   a    G
 
「い」のフィールドです
a z cの3データだけを抽出したいのです。
12か13行のzはどちらか1つだけで重複しない様に抽出したいのです。
 
これで理解して頂けたでしょうか、
説明が悪く申し訳ありません。
よろしくお願いします。

回答
投稿日時: 19/04/03 11:23:48
投稿者: mayu.

引用:
これで理解して頂けたでしょうか、

理解はしていますが、条件として成り立たず矛盾していますので
順を追って説明いたします。
 
水の味さんの投稿 2019/03/30 16:42:49
引用:
「う」のフィールドのデータを重複無しで
ABCDFを簡単に抽出するにはどうすればいいでしょうか
という場合、
「う」の値が一意に定まるよう行を抽出するには
( 同じ値が重複する場合は「あ」が最小値の行を抽出 )
 
 あ  い  う
------------------
 1  x  A  ●
 2  z  C  ●
 3  s  A
 4  y  B  ●
 5  z  A
 6  s  C
 7  x  B
 8  v  D  ●
 9  z  A
 10  y  F  ●
 11  c  G  ●
 12  z  G
 13  z  G
 14  a  G
 
●の付いた行が対象となります。
( これについては 2019/04/01 10:56:17 にSQLで回答済です )
 
ですが
「う」列の値を一意にするという条件で、行を抽出している以上、
「い」列の s( 3番 )や a( 14番 )が含まれた行は 当然ですが抽出対象外となります。
 
ところが
水の味さんの投稿 2019/04/01 09:17:27
引用:
「い」のcz aです。
12のzでも13のzでもどちらか一つだけでcz aを抽出したいのです。

唐突に「い」列の話が出てきて、この列も絞り込み対象になる(?)ということですし、
もうこの時点で
引用:
「う」のフィールドのデータを重複無しで表示
と相反するご要望です。
また、「い」列の値も抜けのないよう抽出するとなれば
 
 あ  い  う
------------------
 1  x  A  ●
 2  z  C  ●
 3  s  A  ○
 4  y  B  ●
 5  z  A
 6  s  C
 7  x  B
 8  v  D  ●
 9  z  A
 10  y  F  ●
 11  c  G  ●
 12  z  G
 13  z  G
 14  a  G  ○
 
○が付いた行も対象になり、
そうすると今度は、「う」列の値は A と G が重複することになりますよね。
 
繰り返しになりますが
最終的にどのような表示になればいいのか、第三者にわかるよう説明いただくか
または
どういった理由でどの行が抽出対象になるのか、データ例にマーキングして説明いただけますか。

回答
投稿日時: 19/04/03 11:41:06
投稿者: mayu.

引用:
「う」のデータの重複無しでABCDFを簡単に抽出する

簡単なものから難しいものまで、とりあえずこの条件を満たすSQLを載せておきます。
 
# 繰り返しになりますが、SQL文中の テーブル名 は
# ご自身で作成されたものに合わせて、変更するのをお忘れなく。
 
■ 集計クエリと結合
SELECT あ
     , い
     , う
FROM テーブル名 x
INNER JOIN
(
    SELECT Max( あ ) As mx
    FROM テーブル名
    GROUP BY う
) y
ON x.あ = y.mx
ORDER BY う ;

■ 自己結合
SELECT x.あ
     , x.い
     , x.う
FROM テーブル名       x
INNER JOIN テーブル名 y
        ON x.う = y.う
WHERE x.あ <= y.あ
GROUP BY x.あ
       , x.い
       , x.う
HAVING x.あ = Max( y.あ )
ORDER BY x.う ;

■ 存在検査の相関サブクエリ
SELECT あ
     , い
     , う 
FROM テーブル名 x
WHERE NOT EXISTS
(
    SELECT 1 FROM テーブル名 y
    WHERE y.う = x.う
      AND y.あ > x.あ
)
ORDER BY う ;

■ 並び替えを利用した相関サブクエリ
SELECT あ
     , い
     , う 
FROM テーブル名 x
WHERE あ = 
(
    SELECT TOP 1 あ FROM テーブル名 y
    WHERE y.う = x.う
    ORDER BY あ DESC
)
ORDER BY う ;

※ TOP句のサブクエリは以下のように記述してもいいでしょう。
SELECT あ
     , い
     , う 
FROM テーブル名 x
WHERE あ =
(
    SELECT Max( あ ) FROM テーブル名 y
    WHERE y.う = x.う
)
ORDER BY う ;

回答
投稿日時: 19/04/03 15:04:17
投稿者: Suzu

たぶん。。
 

引用:
「う」のデータの重複無し

 
あ い う 
1  x  A 
2  z  C 
3  s  A 

の表に対してのコメント
 
 
引用:
「い」のcz aです。

 
  あ   い   う 
  -------------------- 
  11   c    G 
  12   z    G 
  13   z    G 
  14   a    G 

の表のレコードの例を挙げていった言葉。
 
それらが、質問者/回答者 共にまぜこぜで続いているだけにお見受けします。
 
前者の表なら
SELECT DISTINCT う FROM テーブル名 ;
 
後者の表なら
SELECT DISTINCT い FROM テーブル名 ;
 
になるだけだと思いますがいかがでしょう。

回答
投稿日時: 19/04/03 17:55:05
投稿者: mayu.

Suzuさん、フォローありがとうございます。
 

引用:
前者の表なら
SELECT DISTINCT う FROM テーブル名 ;

と私も思ったので、2019/03/30 22:26:16 に
 
引用:
単純明快に
 
    SELECT DISTINCT う FROM テーブル名 ;
 

「う」がユニークな結果セットになりますけど
これがご希望の結果ではないのでしたら、もう少し詳しく説明しましょう。

と回答しているのですけど
解決には至っていないんですよね。どういうことなんでしょう...。
 
引用:
SELECT DISTINCT い FROM テーブル名 ;

もういっそのこと、これであってほしいです。

投稿日時: 19/04/03 19:09:09
投稿者: 水の味

mayuさんSuzuさん
大変ありがとうございました。
 
 
SELECT Max( あ ) As あの最大, い, う
FROM テーブル名
GROUP BY い, う
ORDER BY い, う ;
 
上記SQLを参考に下記
SELECT Max( あ ) As あの最大, う
FROM テーブル名
GROUP BY う
ORDER BY う ;
でできました。
 
更に
SELECT DISTINCT う FROM テーブル名 ;
このSQLでも結果同じでした。
 
434の重複データが
重複無しで359のデータを抽出する事ができました。
 
お騒がせしました。
SQLの勉強にもなりましたし、
本当にありがとうございました。