プロが教える店舗&オフィスのセキュリティ対策術

下記のようなデータがあります。

ファイル番号 順番 カード番号 名前
--------------------------------------------
1    1 0010 山田
1    1 0009 佐藤
1    1 0008 鈴木
2    1 1010 高橋
2    1 1011 小林
2    2 1012 北沢
2    2 1013 竹田
3    1 2001 小山
3    1 2000 田中

ファイル番号と順番でグループ化し、カード番号の最小・最大、その最小・最大の名前を
取得したいです。
サブクエリを使用して出来ましたが、1つのクエリで出来ないかと思い、質問しました。

よろしくお願いします。

A 回答 (2件)

SELECT


 CutStr(Max(Format([カード番号],"0000") & ":" & 名前),":",1) AS MAX_番号,
 CutStr(Max(Format([カード番号],"0000") & ":" & 名前),":",2) AS MAX_名前,
 CutStr(Min(Format([カード番号],"0000") & ":" & 名前),":",1) AS MIN_番号,
 CutStr(Min(Format([カード番号],"0000") & ":" & 名前),":",2) AS MIN_名前
FROM T4
GROUP BY [ファイル番号], [順番];

ここでは CutStr()を使っていますが、Format()、Left()、Mid()を利用しても同じこと。そういうことで、『関数を利用すれば』という条件付きで可能だと思います。

Public Function CutStr(ByVal Text As String, _
           ByVal Separator As String, _
           ByVal N As Integer) As String
  Dim strDatas() As String

  strDatas = Split("" & Separator & Text, Separator, , 0)
  CutStr = strDatas(N * Abs(N <= UBound(strDatas)))
End Function
「Accessのクエリについて」の回答画像1
    • good
    • 0

【補足】MAX()、MIN()の回数を減らすには・・・。



SELECT
  Max(Format([カード番号],"0000") & ":" & [名前]) AS THE_MAX,
  Min(Format([カード番号],"0000") & ":" & [名前]) AS THE_MIN,
  CutStr([THE_MAX],":",1) AS Max_番号,
  CutStr([THE_MAX],":",2) AS Max_名前,
  CutStr([THE_MIN],":",1) AS Min_番号,
  CutStr([THE_MIN],":",2) AS Min_名前
FROM T4
GROUP BY T4.ファイル番号, T4.順番;
    • good
    • 0

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