クエリで複数項目を昇順後、連番を付ける方法

このQ&Aのポイント
  • ACCESSクエリで複数項目を昇順にソートし、連番を付ける方法について教えてください。
  • テーブル内の特定の項目を昇順に並べ替え、連番を追加する方法をACCESSクエリで知りたいです。
  • ACCESSクエリを使用して複数の項目を昇順にソートし、連番を追加する方法について教えてください。
回答を見る
  • ベストアンサー

クエリで複数項目を昇順後、連番を付ける方法

お世話になります。 表題の通り、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 ------------------------------ 分かる方、教えてください。 よろしくお願い致します。

  • AKI78
  • お礼率63% (70/110)

質問者が選んだベストアンサー

  • ベストアンサー
回答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 祈、成功!

その他の回答 (3)

  • 30246kiku
  • ベストアンサー率73% (370/504)
回答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()と命名すべきだったかも知れません。

回答No.2

  rst.Close   Set rst = Nothing End Function 最後は、推奨スタイルに直してください。

関連するQ&A

  • アクセスで条件に合うもののみに連番を振る方法は?

    下記のようにテーブル1にデータがあります。 テーブル1 ID 参加番号 級 判定 1   1   2  ◎ 2   2   1  〇 3   3   2 4   4   1  ◎ 5   5   3  ◎ 6   6   2  〇 7   7   1  8   8   3  〇 9   9   2  〇 このデータを追加クエリを使ってテーブル2に追加をします。 その時に級:昇順・参加番号:昇順で並べ替え、同時に判定が〇・◎のものに級別に証書番号として連番を振りたいと考えています。 テーブル2 ID 参加番号 級 判定 証書番号 1   2   1  〇   1 2   4   1  ◎   2 3   7   1  4   1   2  ◎   1 7   3   2 5   6   2  〇   2 6   9   2  〇   3 8   5   3  ◎   1 9   8   3  〇   2 連番を振る場合Dcountを使えばよいみたいですが、級別だけを条件とした場合は連番が振れるのですが、「判定が〇・◎のもの」という条件の付け方がわかりません。 どなたかアドバイスをお願いします。

  • Access 番号をつける方法

    お世話になっております。 access2010でクエリに番号を割り振ろうと思っています。 「ID」は昇順に並んでおり、同一の「ID」に対しての連番をつけたいです。 クエリ フィールド名:ID、名前 001 田中 001 佐藤 002 山田 003 鈴木 ☆完成図 フィールド名:番号、ID、名前 1 001 田中 2 001 佐藤 1 002 山田 1 003 鈴木 Accessでもexcelのcount関数を使うことはできるのでしょうか? それとも、DCountを使うのでしょうか? 2つ関数の使い方や、用途の違いがよくわかりません。 ご存知の方教えて下さい。よろしくお願いします。

  • ACCESSのテーブルで、昇順並び替え後、連番フィールドを作成したい

    表題の通りなのですが、 今現在ACCESS2000を使ってデータベースを作成しています。 その際、 ---------------------- 連番  項目 00001  りんご 00002  ばなな 00003  みかん 00004  もも ---------------------- というようなテーブルで[項目]を昇順で並び替え後、 連番が自動的に振られるようなクエリ(無理そうならその他の方法でも)を作成したいと思っています。 今現在はクエリで以下のように昇順で並び替えられたものを、 ---------------------- 連番  項目 00002  ばなな 00003  みかん 00004  もも 00001  りんご ---------------------- 一旦エクセルにエクスポートして、オートフィルで[連番]を書き換え後、再度ACCESSにインポートし以下のような完成形にもっていっています。 ---------------------- 連番  項目 00001  ばなな 00002  みかん 00003  もも 00004  りんご ---------------------- しかし、頻繁に[項目]書き換え・追加のあるデータベースなので、結構な時間を費やしてしまい、とても効率が良いとはいえない状態です。 どうにかACCESS内で完結できる方法はないものでしょうか? ご享受の程よろしくお願いいたします。

  • excelVBA 項目ごとに連番をふりたい

    よろしくお願いします。 excelで連番を振りたいのですが、隣のセルに並んでいる 項目ごとに振りたいのです。VBAでできるでしょうか? 番号を振りたいのはB列で、名前ごとに1から順番に番号を 振りたいです。名前が変わるとまた1に戻って、振っていき、 A列がなくなると終了です。 A列の名前の数や、それぞれのデータ数、 全体のデータ数などは、ばらばらです。 もしかしたら列数はかわるかも知れませんが、 隣の列の項目ごとに番号を1から振る、ということは 変わりません。 (A列) (B列)  山田    1  山田    2  山田    3  田中    1  田中    2  田中    3  田中    4  佐藤    1  佐藤    2  加藤    1  斎藤    1  斎藤    2  斎藤    3  斎藤    4  斎藤    5   ・    ・   ・    ・   ・    ・ 今は目で見ながら毎日、オートフィルタでがんばっています。 これができるとすごくうれしいです。 よろしくお願いいたします。

  • アクセスのクエリに「PHONETIC」関数はないのですか?

    アクセス2003です。 テーブル1 名前 佐藤 鈴木 木村 を クエリ1にて 名前  ふりがな 佐藤   サトウ 鈴木   スズキ 木村   キムラ というようなフィールドを作成したいのですが クエリのデザインビューのビルドで見る限りだと 「PHONETIC」関数がありませんでした。 クエリではなくテーブルに手打ちするしかないのでしょうか? よろしくお願い致します。

  • ACCESSのクエリで連番をつけたい!

    過去に同じような質問がありますが、どうしてもうまくいかないので 再度質問させてください。 当方はそれほどスキルが高くないのでSQLなどはさっぱりです・・・・ 下記のような処理を行いたいのですが、 何卒宜しくお願いいたします。 ・「CUSTOMER」ごとに「SHIPMENTDATE」の昇順で「NO」に連番をつけたい ・データは数字ではなくTEXT ・全データは15万件ほど テーブル名:カウント対象受注 CUSTOMER ORDER REGULAR SHIPMENTDATE NO 00020041 000160104 0024174 2011/3/15 4 00020033 000001931 0000323 2011/2/20 2 00020009 000052835 0008807 2010/12/12 1 00020041 000160103 0024174 2011/2/15 3 00020033 000001930 0000323 2010/12/20 1 00020041 000160102 0024174 2011/1/15 2 00020033 000001932 0000323 2011/4/20 3 00020009 000052836 0008807 2011/1/12 2 00020041 000160101 0024174 2010/12/15 1 00020041 000160105 0024174 2011/4/15 5

  • [Access]別テーブルの最大値以降の連番振り

    過去の質問を色々調べたのですが、結局以下の連番の振り方が分からず・・・困っています。 どなたか助けて下さい。お願いいたします。 テーブルA(蓄積されている過去テーブル) 伝票番号  顧客NO  注文日 001 111111 2012/11/10 001 111111 2012/11/10 002 222222 2012/11/25 002 222222 2012/11/25 002 222222 2012/11/25 003 333333 2012/12/31 テーブルB(新規にインポートするテーブル) 004 444444 2013/02/01 004 444444 2013/02/01 005 222222 2013/02/15 005 222222 2013/02/15 006 555555 2013/02/15 006 555555 2013/02/15 上記のように、テーブルBをインポートした時に、伝票番号を「004,004,005・・・」という風に 顧客NO毎に連番を振りたいです。 DmaxやDcount関数を使う事はなんとなく分かったのですが、うまくいきません。 出来れば、クエリで実現したいと思ってます。 テーブルAにある顧客がテーブルBに出てきたとしても、関係なく連番が振れれば問題無いので、 テーブルAからは最大値+1の値だけ取れればいいです。 宜しくお願いいたします!!

  • Accessで一致データを抜いて項目をずらす方法

    Access2000を使用して、テーブル1のフィールド2~5で、テーブル2と一致したフィールドを抜いて項目をシフトさせたいのですが、どのような方法があるのでしょうか。 <元テーブル>    フィールド→ 氏名, 名1, 名2, 名3, 名4 ・テーブル1の項目 山田,花子,次郎,三郎,四郎           鈴木,五郎,六郎,七朗,和子           佐藤,和子,一郎,太郎,四郎 ・テーブル2の項目 山田,花子           鈴木,七朗           鈴木,和子          佐藤,一郎           佐藤,四郎           佐藤,和子 <変換後テーブル>テーブル1を基準として   フィールド→ 氏名, 名1, 名2, 名3, 名4           山田,次郎,三郎,四郎,null           鈴木,五郎,六郎,null,null           佐藤,太郎,null,null,null 分りずらい説明で申し訳ありませんが、宜しくお願いします。

  • Access:Dcount関数

    Access:Dcount関数 の使用方法について質問です。 テーブル作成クエリで新規フィールドに通し番号として新たに連番を打ちたいのですが、 No: DCount("番号","情報一覧","[番号]<=" & [情報一覧]![番号]) このようにした場合に結果は10,13,15,19のようにとびとびの番号しか出てきませんでした。 関数を誤って理解してるものとは思うのですがどうおかしいのかがよくわからず; 「番号」は連番ではなく、重複ないIDです。 よろしく御教授ください。

  • フォームでの連番

    お世話になります。 フォームにて書類に連番をつけていきたいと思うのですが VBやマクロがわからないので、質問させていただきます。 アクセス2000を使用しています。 状況は、連番の頭に西暦2008年なら2008の様に番号をつけ そのあとは普通に001、002・・・と3桁の番号をふっていきます。 自分でわからないなりに調べたのですが、どうもIF文とDcount文を 使うみたいなのですが、どうもプログラムというものがわからず 困っております。 初歩的かもしれませんが、教えていただけませんでしょうか? 出来れば、ボタン一発で次のレコードの追加と連番を同時に 処理できれば幸いです。 説明がわかりにくいかもしれませんが、何卒よろしくお願い いたします。

専門家に質問してみよう