access2002
部署、社員番号、社員の入社日、現部署への配属日のテーブルがあります。
busho,staffID,nyushaDate,haizokuDate
00001,1010100,2000/01/01,2000/01/01
00001,1010101,2000/04/01,2006/04/01
00001,1010102,2006/04/01,2007/04/10
00002,1010103,2000/04/01,2000/04/01
00002,1010104,2000/04/01,2006/04/01
00002,1010105,2006/04/01,2006/04/08
00003,1010106,2000/01/01,2000/01/01
00003,1010107,2006/01/01,2007/04/01
00003,1010108,2007/04/01,2007/10/01
このテーブルから指定した日付以前の入社日で各部署の最新の配属者を抽出したいと思っています。
例えば、2006年1月1日で検索すると
00001,1010101,2000/04/01,2006/04/01
00002,1010104,2000/04/01,2006/04/01
00003,1010107,2006/01/01,2007/04/01
という結果を望んでいます。
まず以下のようなクエリを作成しました。
SELECT T.busho, T.staffID, T.nyushaDate, Max(T.haizokuDate) AS haizokuDateの最大
FROM T
GROUP BY T.busho, T.staffID, T.nyushaDate
HAVING (((T.nyushaDate)<=[検索日?]));
しかし結果は、
00001,1010100,2000/01/01,2000/01/01
00001,1010101,2000/04/01,2006/04/01
00002,1010103,2000/04/01,2000/04/01
00002,1010104,2000/04/01,2006/04/01
00003,1010106,2000/01/01,2000/01/01
00003,1010107,2006/01/01,2007/04/01
となり配属最新日が抽出できませんでした。
次に過去ログをいろいろ調べて、以下のようなクエリを作成しました。
SELECT T.busho, T.staffID, T.nyushaDate, T.haizokuDate
FROM T
WHERE (((T.nyushaDate)<=[検索日?]) AND ((T.haizokuDate)=(SELECT MAX(haizokuDate) FROM T AS B WHERE T.busho=B.busho)));
しかし今度は、何も表示されませんでした。
何が間違っているのでしょうか。
どのようにすれば望む結果が得られるのでしょうか。
よろしくお願いします。
No.6
- 回答日時:
質問への直接の回答ではないですが、autyさんが説明しようとしているのは、SQL99(?)で標準SQLにも入った「行値構成子(row value constructor)」です。
行値式と呼ばれる場合もあります。主要なRDBMSでは実装されていますが、SQL Serverでは未実装であり、ACCESSでも未実装だと思います。
No.5
- 回答日時:
数学でいうと
(x1,y1) = (x2,y2)
というようなもので、SQLの場合の
複数行副問い合わせ
に対応します。今回は、
select busho,max(haizokuDate)
となっている部分が2次元(2列の事です)となっています。
またイコールでなく
(x1,y1) in ( (x2,y2),(x1,y1),(x3,y3) )
の形をとっています。
この方法は、単にグループごとのmaxを求めるだけでなく(このままだとそのときのbusho情報が消えてしまいます。)、そのbusho情報をペアにして覚えておくことが出来ます。
Oracleの場合は、できるのですが。
No.4
- 回答日時:
T:
busho___staffID_____nyushaDate___haizokuDate
______1___1010100___2000/01/01__2000/01/01
______1___1010101___2000/04/01__2006/04/01
______1___1010102___2000/04/01__2007/04/10
______2___1010103___2000/04/01__2000/04/01
______2___1010104___2000/04/01__2006/04/01
______2___1010105___2006/04/01__2006/04/08
______3___1010106___2000/01/01__2000/01/01
______3___1010107___2006/01/01__2007/04/01
______3___1010108___2007/04/01__2007/10/01
>指定した日付以前の入社日で
>各部署の最新の配属者を抽出
つまり、2006年1月1日以前の[busho]毎の最新の[haizokuDate]に該当するレコードを抜き出したいということ。
ならば、そのまま SQL文で表現すれば・・・。
SELECT * FROM T
WHERE haizokuDate=DBLookup("Max(haizokuDate)",
"T",
"nyushaDate<=#2006/01/01# AND busho=" & busho);
busho___staffID_____nyushaDate____haizokuDate
______1___1010102___2000/04/01___2007/04/10
______2___1010104___2000/04/01___2006/04/01
______3___1010107___2006/01/01___2007/04/01
ウヌヌ!busho=1 の該当レコードが違った。
Access は関数を組み込めるので単一Select文の体裁でも書けます。
DBLookup関数は、結局は SQL文を生成していますので、結局はNo1さんの回答と同じですが・・・。
メリットは、クエリを簡略化できるということです。
Public Function DBLookup(ByVal strField As String, _
ByVal strTable As String, _
Optional ByVal strWhere As String = "", _
Optional ByVal ReturnValue = "") As Variant
On Error GoTo Err_DBLookup
Dim DataValue
Dim strQuerySQL As String
Dim rst As ADODB.Recordset
Set rst = New ADODB.Recordset
strQuerySQL = "SELECT " & strField & " FROM " & strTable
If Len(strWhere) > 0 Then
strQuerySQL = strQuerySQL & " WHERE " & strWhere
End If
With rst
.Open strQuerySQL, _
CurrentProject.Connection, _
adOpenStatic, _
adLockReadOnly
If Not .BOF Then
.MoveFirst
DataValue = .Fields(0)
End If
End With
Exit_DBLookup:
On Error Resume Next
rst.Close
Set rst = Nothing
DBLookup = IIf(Len(DataValue & ""), DataValue, ReturnValue)
Exit Function
Err_DBLookup:
MsgBox "SELECT 文の実行時にエラーが発生しました。(DBLookup)" & Chr$(13) & Chr$(13) & _
"・Err.Description=" & Err.Description & Chr$(13) & _
"・SQL Text=" & strQuerySQL, _
vbExclamation, " 関数エラーメッセージ"
Resume Exit_DBLookup
End Function
No.2
- 回答日時:
[検索日?]は、よく分かっていませんが、次の方法を試してみてください。
・ 2次元の比較が行えるときは、
SELECT busho, staffID, nyushaDate, haizokuDate AS haizokuDateの最大
FROM T
where nyushaDate<=[検索日?] and (busho,haizokuDate) in (
select busho,max(haizokuDate) from T
GROUP BY busho
where nyushaDate<=[検索日?]);
・ 2次元の比較が使えないときは、
SELECT busho, staffID, nyushaDate, haizokuDate AS haizokuDateの最大
FROM T T1
where nyushaDate<=[検索日?] and haizokuDate=(
select max(T2.haizokuDate) from T T2
where T2.nyushaDate<=[検索日?] and T2.busho=T1.busho);
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Access(アクセス) アクセス where句を使用して複数条件抽出をするには 2 2022/08/29 13:24
- Oracle 質問です。 下記のテーブルとデータがあり、 取得想定結果のように出力したいです。 下記のsqlだと0 2 2023/05/23 19:10
- MySQL SQLです。下記の問合せを行うクエリを、PhpMyAdminで作成して実行せよ。 「昨年の各月の総降 1 2023/07/01 00:32
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- Access(アクセス) アクセス 有効なフィールド名、または式として認識できませんのエラー 3 2022/08/19 11:53
- MySQL PhpMyAdminで作成して実行せよ。 東京23区を、皇居を中心とした4つのエリア(南東, 南西, 1 2023/06/11 11:58
- SQL Server [SQLServer] テーブル名からカラム名を取得する 1 2022/08/23 21:20
- MySQL SQLです。こんな感じですか?あってますか? うまくいきません教えてくださいお願いします 1 2023/07/08 15:27
- MySQL うまくいきません教えてくださいお願いしますSQLです。クエリ構文です。 1 2023/07/07 12:39
- Visual Basic(VBA) このVBAでExcelアプリケーションを作成は必要ですか? 3 2023/07/19 21:13
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
SELECT FOR UPDATE で該当レコ...
-
単一グループのグループ関数で...
-
アクセスのレポートでレコード...
-
「数字で始まらない」ものを抽...
-
【PL/SQL】FROM区に変数を使う方法
-
where句中のtrim関数について
-
トランザクションログを出力せ...
-
group byの並び順を変えるだけ...
-
複数レコードを横並び1レコー...
-
osqleditについて
-
updateで複数行更新したい
-
データ
-
SQL*Loader Append
-
引数によってwhere句を切り替え...
-
これをSQL文で出来るでしょうか?
-
大量レコードをTRUNCATEせずに...
-
PL/SQLでフェッチでNULLの項目...
-
MERGE文について
-
ACCESS レコードの並び順について
-
レコードの更新履歴について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【PL/SQL】FROM区に変数を使う方法
-
単一グループのグループ関数で...
-
SELECT FOR UPDATE で該当レコ...
-
AccessのSQL文で1件のみヒット...
-
トランザクションログを出力せ...
-
where句中のtrim関数について
-
updateで複数行更新したい
-
group byの並び順を変えるだけ...
-
アクセスのレポートでレコード...
-
SQLで条件にヒットしたレコード...
-
引数によってwhere句を切り替え...
-
SQL*Loader Append
-
「数字で始まらない」ものを抽...
-
データ
-
1レコード全てを改行なしで表...
-
これをSQL文で出来るでしょうか?
-
ORMについて
-
ACCESS レコードの並び順について
-
BLOB型項目をSQLの検索条件に指...
-
【SQL】違うフィールド同士の集...
おすすめ情報