お世話になります。
表題の通り、ACCESSクエリで連番を付けるにはどうすれば宜しいでしょうか?
調べたのですが、よく分からない為、
関数又は、SQLに詳しい方、よろしくお願いいたします。
(下記もDCOUNT関数でできますか?)
テーブル名:T_A
---------------------------
番号 名前 ランキング
1 佐藤 1
2 鈴木 2
3 佐藤 1
4 鈴木 2
5 佐藤 2
---------------------------
上記のテーブルがあったとして、特産品及び、ランキングを昇順すると、
下記の通りとなります。
---------------------------
番号 名前 ランキング
3 佐藤 1
1 佐藤 1
5 佐藤 2
4 鈴木 2
2 鈴木 2
---------------------------
ここで、連番という項目を追加して、上から1,2,3と連番を付けるにはどうすれば
宜しいでしょうか。
↓↓↓↓↓↓↓
(得たい結果)
------------------------------.
番号 名前 ランキング 連番←追加項目
3 佐藤 1 1
1 佐藤 1 2
5 佐藤 2 3
4 鈴木 2 4
2 鈴木 2 5
------------------------------
分かる方、教えてください。
よろしくお願い致します。
No.1ベストアンサー
- 回答日時:
------------------------------.
番号 名前 ランキング 連番←追加項目
3 佐藤 1 1
1 佐藤 1 2
5 佐藤 2 3
4 鈴木 2 4
2 鈴木 2 5
------------------------------
要は、当該のId(=番号)が何番目に出現しているのか?
3--->1番目
1--->2番目
ならば、次のようなクエリを作成すれば目的は達成できます。
SELECT
T1.ID,
T1.名前,
T1.ランキング,
IdFound("SELECT ID FROM T1 ORDER BY [ランキング], 名前",[ID]) AS 連番
FROM T1
ORDER BY T1.名前, T1.ランキング;
さて、問題は IdFound() が提供されていないこと。
そこで、自作します。
Public Function IdFound(ByVal strSQL As String, ByVal Id As Integer) As Integer
Dim N As Integer
Dim M As Integer
Dim rst As ADODB.Recordset
Set rst = New ADODB.Recordset
With rst
.Open strSQL, _
CurrentProject.Connection, _
adOpenStatic, _
adLockReadOnly
If Not .BOF Then
M = .RecordCount
.MoveFirst
For N = 1 To M
If .Fields(0).Value = Id Then
Exit For
End If
.MoveNext
Next N
End If
End With
IdFound = N
End Function
祈、成功!
No.4
- 回答日時:
「番号」に重複がない長整数である事を前提にすると
一番簡単なのは、
テーブル「T_A」にフィールド「連番」(長整数)を設けて
VBA で「連番」を設定する事だと思います。
Public Sub Samp1()
Dim rs As DAO.Recordset
Dim sSql As String
sSql = "SELECT 連番 FROM T_A ORDER BY 名前, ランキング, 番号 DESC;"
Set rs = CurrentDb.OpenRecordset(sSql)
While (Not rs.EOF)
rs.Edit
rs(0) = rs.AbsolutePosition + 1
rs.Update
rs.MoveNext
Wend
rs.Close
Set rs = Nothing
End Sub
※ 上記 DAO の AbsolutePosition は、0 スタートの連番になるので
これを利用して単純に設定するものです。
(ADO に書き換える場合は、1 スタートなので + 1 は不要になります)
注意するのは、どの順番で得ておくか、だけです。
( ORDER BY 名前, ランキング, 番号 DESC )
フィールド「連番」を設けずにクエリだけで・・・とした場合、
1レコード毎に OpenRecordset すると、それだけでも遅くなると思うので
この「番号」の「連番」は何・・・
1度求めたものを Dictionary に格納しておいて、その中の情報を返す様にしてみます。
Dim dic As Object
Public Function myNoInit() As Boolean
Dim rs As DAO.Recordset
Dim sSql As String
If (dic Is Nothing) Then
Set dic = CreateObject("Scripting.Dictionary")
End If
dic.RemoveAll
sSql = "SELECT 番号 FROM T_A ORDER BY 名前, ランキング, 番号 DESC;"
Set rs = CurrentDb.OpenRecordset(sSql)
While (Not rs.EOF)
dic(rs(0).Value) = rs.AbsolutePosition + 1
rs.MoveNext
Wend
rs.Close
Set rs = Nothing
myNoInit = True
End Function
Public Function myNo(vNum As Variant) As Long
If (IsNull(vNum)) Then Exit Function
If (dic Is Nothing) Then Call myNoInit
myNo = dic(vNum)
End Function
上記を標準モジュールに記述しておいて、クエリでは以下のように
SELECT 番号, 名前, ランキング, myNo(番号) AS 連番
FROM T_A
WHERE myNoInit()
ORDER BY 名前, ランキング, 番号 DESC;
※ 不都合あれば修正してください。
No.3
- 回答日時:
お詫びと訂正:
× IdFound("SELECT ID FROM T1 ORDER BY [ランキング], 名前",[ID])
〇 IdFound("SELECT ID FROM T1 ORDER BY 名前, [ランキング],",[ID])
当然に、[ID]が出現する位置を確認する為の SQL文とクエリの並び(ORDER BY XXX, XXX)は同じでなければなりません。先の回答では、それが一致していませんでした。当然に、名前→ランキングの順で並べないと正しく連番は付与されません。ちょっと、単純なミスがありましたので訂正しておきます。
PS、IdFound()→InRecord()
なお、関数名ですが Instr()に近い働きですので InRecord()と命名すべきだったかも知れません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP MySql PHP 2つのテーブルをJOINで結合 user_idで抽出 1 2023/01/03 14:04
- Access(アクセス) アクセスで教えてください。 例えばテーブル1に 1 佐藤 2 鈴木 3 佐々木 コードと住所一覧があ 3 2022/06/11 20:45
- Excel(エクセル) Excelマクロ 差分抽出の方法が知りたいです。 2 2023/03/07 13:25
- Android(アンドロイド) アンドロイドのスマホ2台の連絡先のクラウドへの同期について 5 2023/08/20 09:34
- Visual Basic(VBA) 【ExcelVBA】動的にボタン、ボタン名を生成できますか? 7 2022/04/08 12:54
- その他(学校・勉強) 日本語について 3 2022/04/07 22:50
- Excel(エクセル) EXCEL 関数を教えてください。(A列の同じ値が複数ある場合vlookupで出来ますか) 4 2022/12/07 20:54
- 計算機科学 Excel ある行と列が交わったところにマークを付けるには 7 2023/01/24 08:46
- Visual Basic(VBA) 先ほど、回答者様によって教えていただいたのですがどうしたらいいか分かりません。 ユーザーフォーム上に 2 2023/02/21 22:25
- Excel(エクセル) エクセルの条件付き書式 個人シートを参照して集計シートに色付けしたい 1 2023/06/22 00:39
このQ&Aを見た人はこんなQ&Aも見ています
-
プロが教えるわが家の防犯対策術!
ホームセキュリティのプロが、家庭の防犯対策を真剣に考える 2組のご夫婦へ実際の防犯対策術をご紹介!どうすれば家と家族を守れるのかを教えます!
-
ACCESSのテーブルで、昇順並び替え後、連番フィールドを作成したい
Access(アクセス)
-
ACCESS クエリで1から順番に番号を表示したい
Access(アクセス)
-
Access2003 クエリで、空の列は作れますか?
Access(アクセス)
-
-
4
Accessで条件が2つのグループに連番をふる
Access(アクセス)
-
5
【Access】Dcount関数の複数条件で順位を付ける方法について
Access(アクセス)
-
6
ACCESSで日付ごとに自動連番(日付+連番)する方法
Access(アクセス)
-
7
ACCESS レコードの並び順について
Access(アクセス)
-
8
アクセスで#エラーを表示させない方法は?
Access(アクセス)
-
9
accessでの文字列の混ざった連番処理について
Access(アクセス)
-
10
前のレコードの値を自動で入れたい
PowerPoint(パワーポイント)
-
11
accessテーブル作成クエリを実行したときにオートNo(のような)振る方法
その他(データベース)
-
12
アクセスで『0の値以外』を表示する方法
Access(アクセス)
-
13
Accessで別テーブルの値をフォームに表示したい
その他(データベース)
-
14
ACCESSでVBAから選択クエリの抽出条件を指定したい
Access(アクセス)
-
15
Accessでデータシートに同じデータがいくつもでてしまいます。
その他(データベース)
-
16
Access 最後のレコードに到達するまでループ処理を行う方法
Access(アクセス)
-
17
Access2000で抽出したデータに連番をふるには
Access(アクセス)
-
18
Accessでテーブルの値をテキストボックスに代入するには?
Access(アクセス)
-
19
2つ目のレコードの値を取得するには?
Access(アクセス)
-
20
Accessのフォーム上にレコード数とレコード番号の表示
その他(データベース)
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
複雑なシフト表から1日ごとの...
-
彼氏が「君」っていいます
-
名前を呼ばずに「すみません」...
-
マイページとは?どこにありま...
-
人の名前を覚えられない人にイ...
-
エクセルで外部データの取り込...
-
「失礼ですが・・・」と名前を...
-
彼氏が良く、「◯◯(私の名前)」...
-
AV女優の名前教えて
-
名前を打つ順番の心理
-
メールで彼女の名前を打ち間違えた
-
息子が名前が原因でいじめられ...
-
古い名前ですよね?
-
Hの最中に違う女の名前を言わ...
-
みなさん、恋人のLINEの名前は...
-
女子に聞きたい。 異性に名前は...
-
名前を呼ばれる方と、名前を呼...
-
私の名前は莉奈(りな)です あ...
-
電話をかけてきて、社名だけで...
-
DNAの化学名って何ですか?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
複雑なシフト表から1日ごとの...
-
名前を呼ばずに「すみません」...
-
彼氏が「君」っていいます
-
今LINEの名前をフルネームで登...
-
電話をかけてきて、社名だけで...
-
名前を呼ばれる方と、名前を呼...
-
みなさん、恋人のLINEの名前は...
-
Hの最中に違う女の名前を言わ...
-
AV女優の名前教えてください
-
「失礼ですが・・・」と名前を...
-
AV女優の名前教えて
-
彼氏が良く、「◯◯(私の名前)」...
-
人名にあまりふさわしくない名...
-
マイページとは?どこにありま...
-
メールで彼女の名前を打ち間違えた
-
ジャージのズボンで裾を絞って...
-
やたら名前を呼ぶ?心理とは
-
DNAの化学名って何ですか?
-
男性が女性の名前を呼ばないの...
-
イクときに彼女の名前を呼ぶ男...
おすすめ情報