以下のセレクト文を書いたのですが、
うまく選択することができません。
やりたいことはIDが重複しているもののうち、日付(time)の最も古いものを一行だけ選択する。
初歩的なことかもしれませんが苦痛を感じております。どうかご教授お願いいたします。


例)
ID| time | subject |
100 0523 算数
100 0525 算数
100 0523 国語
110  0526 国語
    ↓
したいこと)
ID| time | subject |
100 0523 算数
100 0523 国語
110  0526 国語

SELECT distinct ID,time,subject
FROM DB
GROUP BY ID,subject,HAVING MIN(time)
ORDER BY ID,D_time,subject

このQ&Aに関連する最新のQ&A

A 回答 (4件)

1.先ず使っているDBシステムとバージョンを明記しましょう。


SQLはDBシステム、バージョン別に方言があるので、記述が微妙に
違います。

2.考え方
(1)IDと同一IDでtimeの最小値を求める。
(2)上記クエリと一致するデータが目的の情報

3.具体的な記述
SELECT B.ID,B.time,B.subject
FROM (SELECT ID,Min(time) mtime FROM DB GROUP BY DB) A
INNER JOIN DB B ON A.ID=B.ID AND A.mtime=B.time
ORDER BY B.ID,B.subject

4.説明
FROM句にある(SELECT ID,Min(time) mtime FROM DB GROUP BY DB)は
考え方(1)で示したIDと、同一IDのtimeの最小値を返すクエリです。
Min(time)にはフィールド名"mtime"、クエリには別名"A"を割り当て
ます。
INNER JOIN はこれと結合するテーブルで、即ち、上記クエリと
結合するデータです。これにも別名"B"を割り当てます。
別名を割り当てないと同じフィールドを識別するための修飾子が
一意になりません。
ON句は結合条件を表します。各項目はクエリ側がA、データ側がBで
修飾されているのが分かると思います。
ORDER BY句ではIDとsubjectを指定します。timeはIDにつき1通りしか
ないので、並べ替え項目に指定しても無駄です。
ここに指定する項目も別名による修飾が必要です。

尚、timeが予約語のDBシステム、バージョンがあるので、その場合は
何らかの修正が必要です。

この回答への補足

返信ありがとうございます。
このSQLはACCESSに対して使っています。

回答していただいた内容で実行してみましたが、mtimeを
認識していないのか、
エラーで”[Microsoft][ODBC Microsoft Access Driver] SELECT ステートメントが間違っている予約語や引数を含んでいるか、区切り記号が正しくありません。”と出てしまいます。

何か問題があるのでしょうか?
お手数ですが、回答していただけるとうれしいです。

補足日時:2009/05/15 15:37
    • good
    • 0
この回答へのお礼

ちなみにmtime を記述すると”[Microsoft][ODBC Microsoft Access Driver] クエリ式 'Min(D_time) mtime' の 構文エラー : 演算子がありません。”
というエラーも出ます

お礼日時:2009/05/15 16:32

AccessなのでASという予約語を入れる必要があります。


また、timeは時刻を求める関数で予約語なので[]で囲みます。
というか名前を変えるべき。DBなども宜しくありません。

SELECT B.ID,B.[time],B.subject
FROM (SELECT ID,Min(time) AS mtime FROM DB GROUP BY ID) AS A
INNER JOIN DB AS B ON A.ID=B.ID AND A.mtime=B.[time]
ORDER BY B.ID,B.subject

前の例文でGROUP BY句が間違ってましたね。
誤:GROUP BY DB
正:GROUP BY ID
    • good
    • 0
この回答へのお礼

以前答えていただいた内容を実行していたところ、問題がありました。
再度質問というかたちでお力を貸していただければうれしいのですが..
現行のSQLから、変更したいSQLの内容は、mtimeで取得してきていた最も若い時間にさらに制約をつけ、ある時間の範囲内において、
その中における最も若い時間を取得したいと思います。
変更したいSQLを実行しましたが、結果としてデータが取得されてきません。どこが間違っているのでしょうか?
ちなみに時間の範囲はwebブラウザ上で入力された値を変数にいれ取得してあります(変数w_jyukobistart 、w_jyukobiend)
納期が迫っており助けていただけると幸いです。

*現行のSQL*
日付が最も若いものでかつ、IDとSUBJECTに重複のない
データを抽出する。

"SELECT .sID,B.subject,B.D_time
FROM (SELECT sID,Min(D_time) AS mtime ,subject FROM Reg1Data GROUP BY sID,subject) A
INNER JOIN Reg1Data B ON A.sID=B.sID AND A.mtime=B.D_time GROUP BY B.sID,B.subject,B.D_time ORDER BY B.sID,B.subject;"

*変更したいSQL*
ある範囲の日付の中で(日付は、入力画面から抽出)日付が最も若いものでかつ、IDとSUBJECTに重複のないデータを抽出する。

"SELECT .sID,B.subject,B.D_time
FROM (SELECT sID,Min(D_time) AS mtime ,subject FROM Reg1Data WHERE D_time >= "& w_jyukobistart&" AND D_time <= "& w_jyukobiend&" GROUP BY sID,subject) A
INNER JOIN Reg1Data B ON A.sID=B.sID AND A.mtime=B.D_time GROUP BY B.sID,B.subject,B.D_time ORDER BY B.sID,B.subject;"

お礼日時:2009/06/08 17:05

サンプルデータだけ見て答えると・・


select ID,min(time) as TIME,subject from TABLE group by ID,subject
で、結果的に同じになるんじゃないですかね。

他に項目があって、上記のSQLではダメということなら、上記のSQLで得られる結果と、
元のテーブルを内部結合すれば良いと思いますよ。

この回答への補足

返信ありがとうございます。
結果的にエラーが出てできませんでした。
以下のエラーが出ましたが、解決方法が分かりません。
”要求された名前、または序数に対応する項目がコレクションで見つかりません。 ”

補足日時:2009/05/15 15:35
    • good
    • 0

SELECT distinct ID,time,subject


FROM DB
GROUP BY ID,subject,HAVING MIN(time)
ORDER BY ID,D_time,subject

↓以下でどうでしょうか

SELECT ID, Min([time]) AS 日付, subject
FROM DB
GROUP BY ID, subject
ORDER BY ID, subject;


※ time は予約語なので、変更した方がよいと思います。


ORDER BY ID, subject;

ORDER BY ID, Min([time]), subject;
でも?
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

関連するカテゴリからQ&Aを探す

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QACCESS クエリのデザインビューを開かせたくない。

管理者以外がクエリをデザインビューで開けないように設定したいのですが、セキュリティーの設定では、「構造の読み取り」にチェックを入れる必要があるので、クエリの抽出条件等が参照されてしまいます。(フォームを単票形式にしており、開いているフォームのページのID番号をクエリの抽出条件とし、レポートにその番号の内容のものだけが反映されるよう設定しています。また自分が作った関数の式を見られたくないのです。)クエリの条件がきちんとレポートに反映し、なおかつクエリをデザインビューで見れなくする方法はありますか。(「隠しオブジェクト」にするのは、なしです。ただ、隠しオブジェクトにしてもユーザーは「隠しオブジェクト」の設定ができないのであればありです。)
 プログラムを組むしかないのでしょうか?そうであればどんな感じで組めばいいのか教えてください。

Aベストアンサー

> クエリの条件がきちんとレポートに反映し、

クエリとして保存せずに、レポートのレコードソースでSQL文を使ってやるとか。

レコードソースプロパティで右側の ... をクリックすれば、クエリビルダが
起動しますので。

QVSAM,QSAM,BSAM,BPAM,BDAM

データセット編成とアクセス法に関してですが、それぞれ、どのようなデータセットとして使われることが多いですか?データを入れるとか…、プログラムを入れるとか…。

Aベストアンサー

メインフレームの世界ですね。私が使い慣れているのは
NEC製ですが、共通項が多いので説明します。

> BPAMがプログラムライブラリーか?
簡単にはその通りです。
プログラムだけではないですが、順編成のサブファイル
を複数格納可能な編成方式のファイル(ライブラリ)を
意味します。

> VSAMがDB?QSAM,BSAMがテープとディスクか?
VSAMはDBの原型みたいなものです。
カタログ/VSAMファイル本体以外にジャーナルを持ち、
COMMIT,ROLLBACK制御も可能です。
QSAM,BSAMはVSAMアクセスの動作方式のことで
す(プログラム中では意識する必要ありません)。

> BDAMはディスクか???
これもアクセス方式ですね。目的レコードの相対アドレ
スを指定してアクセス(READ/WRITE)する方式です。

> DBやJCL、ファイルを入れる場合はBPAMか?
DBは別物です。JCL、プログラム等が格納されるファイル
の形式(編成)がBPAMです。

> ボリュームという言葉があるけれど、データ編成で考えてはいけないのか?
ボリュームとは例えば磁気テープ1本、磁気ディスク1
スピンドルといった補助記録媒体の単位です。
→ 磁気ディスクには1ボリューム中に複数の異なる
  データ編成のファイルを作成可能です。

> ボリュームはどのようにできているのか?
VTOCおよびデータ領域です。

> ボリュームより大きいものはなんと言うのか?
通常ボリュームグループという概念があります。
→ この概念が無いとマルチボリュームファイルは作成
  できませんから・・・。

> 機能は、ちゃんと読んでみます。データ編成は他にもありそうな…。
NECの場合だと、相対編成、乱編成、待機結合編成なんて
のもありますね。

> ファイル編成とデータセット編成は同じことだよな…。???
大体において同じ意味で使用しているケースが多いです。

私の会社ではまだメインフレーム現役です・・・。

メインフレームの世界ですね。私が使い慣れているのは
NEC製ですが、共通項が多いので説明します。

> BPAMがプログラムライブラリーか?
簡単にはその通りです。
プログラムだけではないですが、順編成のサブファイル
を複数格納可能な編成方式のファイル(ライブラリ)を
意味します。

> VSAMがDB?QSAM,BSAMがテープとディスクか?
VSAMはDBの原型みたいなものです。
カタログ/VSAMファイル本体以外にジャーナルを持ち、
COMMIT,ROLLBACK制御も可能です。
QSAM,BSAM...続きを読む

Qアクセスのクエリのデザインビュー

表記の件で質問させてください。
デザインビューの抽出条件でIsNullやnotNull
を指定するにはどのようにしたらいいのでしょうか?
よろしくお願いします。
項目タイプは数値型です。

Aベストアンサー

スペースが抜けています

Is Null

Not Is Null

Null <>Null
と入力しても上のように書き変えてくれますよ

Qoracle9i distinct

select distinct 1 as aaa, bbb
from table_a

aaa     bbb
--------------------------
1      a
1      b
1      c

この場合の「distinct 1」というのは
table_aの1列目でdistinctするという
意味でいいのでしょうか?
でもdistinct 2
とすると、aaaの列の値が2になるだけなのですが・・。
すみませんがdistinct 1 の意味を教えていただけますでしょうか。

Aベストアンサー

>この場合の「distinct 1」というのは
>table_aの1列目でdistinctするという
>意味でいいのでしょうか?

>すみませんがdistinct 1 の意味を教えていただけますでしょうか。

distinct 1 に意味はありません。
1 as aaa
の方です。

selectして取り出す結果は、テーブル中の値や、それを加工したものでなくてもかまいません。
今回の場合では、"1"という固定の値を、1列目に出力してというSQLになります。
as aaaは、その列の名前をaaaにしてという意味です。

そのため、2に変えればaaaが2になります。

distinctの意味は分かりますか?

QACCESS2003のクエリのデザインビューの抽出条件について

現在ACCESS2003上で、テーブルとテーブルを結合させて、日時を抽出条件にして表示させるレコードを限定しています。

そこで
発生日時≦対処日時≦回復日時
という抽出条件を
[テーブル1]![対処日時] >=[テーブル2]![発生日時] And [テーブル1]![対処日時]<=[テーブル2]![回復日時]
と記載しています。

ここまでは良いのですが
次に
発生日時-1時間≦対処日時≦回復日時+1時間
という風に抽出条件の範囲を時間で広げてやりたい場合はどのようにすればよいでしょうか

一度、日時をシリアル値に変換するという処理が必要になってくるのでしょうか。
日時のフォーマットは
yyyy/mm/dd hh:mm:ssです。

わかりましたら、ご回答よろしくお願いいたします。

Aベストアンサー

DateAdd関数を調べると分かりますよ

QACCESS2000,桐,ファイルメーカーでカスタマバーコード印刷について

ACCESS2000でカスタマバーコードを印字したいのですが、関数の使い方で困っております。
例)郵便番号 123-4567
  東京都千代田区8-9東京マンションA-1号
を123456789A1 と抜き出したいのです。
桐,ファイルメーカーの関数でも構いません。
最終的に ACCESS2000で印刷を行いますのでCSV出力ができれば良いのです。

Aベストアンサー

> 文字列の長さだけ繰りかえすとのことですが、色々考えてみましたがどうも関数が作成できずマクロになってしまいます。何とか関
> 数で処理したいのでよろしければ
> 参考例をおしえていただければ大変有り難いのですが。

関数だけでやるなら、事前に最大何バイトになるか調べておいて
ひたすら繰り返すしかないんじゃないでしょうか?
=midb(a1,1,1)&midb(a1,2,1)&midb(a1,3,1)&midb(a1,4,1)&…

だから、「マクロでループさせる方が美しい」んですね。

Qリレーションシップがたくさんついているクエリ同士だと、不一致クエリを作

リレーションシップがたくさんついているクエリ同士だと、不一致クエリを作成することはできないのでしょうか?

不一致クエリにしたい二つのクエリのみ別のフォームで作成し直して、不一致クエリを作成すると、抽出してくれたのですが、もともとのリレーションシップがついているクエリのままだと抽出が0になってしまいます。

フィールドやデザインは全く同じなのですが、やはりリレーションシップのせいでしょうか?

Aベストアンサー

【要旨】
クエリの結合線は、『結合先のテーブルのデータを検索条件として
扱う』という働きを持ちます。
リレーションシップによって自動で追加された結合線が不要(無用)
な場合は、クエリのデザインビューから削除する必要があります。

※リレーションシップは削除せず、クエリ毎に結合を編集します※


【詳細】

> リレーションシップがたくさんついているクエリ同士だと、
> 不一致クエリを作成することはできないのでしょうか?

『リレーションシップ』が「直接」レコードの抽出件数を左右する
ことはありません。

ただ、クエリのデザインビューで、リレーションシップが設定
されたテーブル同士を追加した場合等には、それに対応した
『結合線』も自動的に追加されます。

リレーションシップと結合の違いについて(回答No.2):
http://oshiete.goo.ne.jp/qa/5073445.html

この、『クエリのデザインビューでの、テーブルの結合』は、
「複数の検索条件を指定した抽出」としての意味を持つため、
リレーションシップの設定が、結果として(間接的に)、
抽出件数を左右する、ということはあります。
http://oshiete.goo.ne.jp/qa/5683407.html

従って、クエリで実際に行いたい抽出の内容によっては、
リレーションシップの設定を元に自動的に追加された結合を
削除したり、結合の種類を変更したり、といった操作も必要に
なります。

操作方法は、それぞれ以下の通りです:

<結合線の削除>
a)結合線をクリックして太線表示になった状態で、キーボードの
 Deleteキーを押す
b)結合線を右クリックして表示されるメニューから「削除(D)」を
 選択

<結合線の変更>
 結合線をダブルクリックするか、それを右クリックして表示
 されるメニューから「結合プロパティ(J)」を選択すると開く
 『結合プロパティ』ダイアログで、目的に合った項目を選択


・・・以上、長文失礼致しました。

【要旨】
クエリの結合線は、『結合先のテーブルのデータを検索条件として
扱う』という働きを持ちます。
リレーションシップによって自動で追加された結合線が不要(無用)
な場合は、クエリのデザインビューから削除する必要があります。

※リレーションシップは削除せず、クエリ毎に結合を編集します※


【詳細】

> リレーションシップがたくさんついているクエリ同士だと、
> 不一致クエリを作成することはできないのでしょうか?

『リレーションシップ』が「直接」レコードの抽出件数を左右する
ことはありま...続きを読む

Qクエリのフィールドに 式1:DateAdd("d",-2,Date()

クエリのフィールドに 式1:DateAdd("d",-2,Date()) と入力し、実行すると、2日前の日付ではなく、2年前の同じ日付となってしまいます。何が原因か分からず困惑しています。ご教授よろしくお願いいたします。

Aベストアンサー

http://groups.google.az/group/microsoft.public.jp.access/browse_thread/thread/7512043f698bb493
行き詰まったのでGoogle。
上記ではレスがつかなくてOSの再インストールまでしたそうです。
(クリックしても飛ばないかもしれませんのでその際はアドレスをコピペ)
どうも似たような症状。

初心に立ち返って、思いつくままに。
・メニューのヘルプから『アプリケーションの自動修復』
・新規データベースでも発生するか
・ADOのバージョンが古いので、2.5まで上げてみる。Microsoft ActiveX Data Object 2.5 Library
2.1のチェックは外して、プルダウンメニューの中央辺りに2.5があります。
最新は多分、2.8以降になっているかと思います。
・メニューから(VBEでは無い方)『ツール』→『オプション』→『全般タブ』
新規データベースの並び順が、日本語 UniCode であれば、日本語に変更。
これで新たに作ってみて試す。
これで駄目なら私は降参です。

※Microsoft DAO 3.6 Objects Libraryのチェックは戻して置いてください。

http://groups.google.az/group/microsoft.public.jp.access/browse_thread/thread/7512043f698bb493
行き詰まったのでGoogle。
上記ではレスがつかなくてOSの再インストールまでしたそうです。
(クリックしても飛ばないかもしれませんのでその際はアドレスをコピペ)
どうも似たような症状。

初心に立ち返って、思いつくままに。
・メニューのヘルプから『アプリケーションの自動修復』
・新規データベースでも発生するか
・ADOのバージョンが古いので、2.5まで上げてみる。Microsoft ActiveX Data Object 2.5 ...続きを読む

QACCESS2007のクエリについて

ACCESS2007のクエリについて

ACCESS初心者です。
よろしくお願いします。

クエリを作成するときに、デザインビューでフィールドの位置を変更したり、
(たとえば、「氏名」の列を4列目から2列目に移動する)
並べ替えなどをして、データシートビューにすると反映されているのに、
データシートビューでフィールドの位置を変更したり、並べ替えなどをしても、
デザインビューには反映されてませんが、
クエリとはこういうものなのですか?

Aベストアンサー

デザインで設定を元にデータシートビューを(毎度)作ってます。
クエリデザインビューで設定を定義する、
その実行結果を見るのが(クエリの)データシートビュー、
そういう使い方です。
テーブルのデザインビュー、データシートビューも同じ感覚と
みていいでしょう。

デザイン上でも変更できて、データシートビュー上でも変更できたら
何が正しい状態かわからなくなってしまいます。

クエリデザインビューで設定したらデータシートビューで確認、
追加修正あったらクエリデザインビューで修正しまたデータシートビューで確認、
この繰り返しです。
必要に応じて保存。

Qクロス集計での order by句の使い方

下記の order byの部分を年月日でなく合計件数順に並べ変えたいのですが、Count(氏名)を入れると「 order by句で集計関数は使えません」のようなメッセージが出ます。(access2000)
何か良い方法はないでしょうか。

TRANSFORM Count(氏名) AS 氏名のカウント
SELECT 年月日, Count(氏名) AS 合計件数
FROM 日誌
GROUP BY 年月日
ORDER BY 年月日
PIVOT 区分;

#access素人です。

Aベストアンサー

こんにちは。

クロス集計クエリを元に、もう1つクエリを作って
「氏名のカウント」で並び替えをしてみてはどうでしょうか?

ご参考までに。

ではでは・・・


人気Q&Aランキング