- 締切済み
ACCESS(クエリ) 重複する日付の順位
ACCESS2007 + Win7Pro 選択クエリで[日付]フィールドを昇順でソートした場合¥の順位を [日付順位]フィールドに出るようにしたいのですが、 [日付]が重複している場合、例えばレコード数が30個で、 2013/1/1、2013/5/20、2013/11/6の3種類しか存在しないときは、 1、2、3のいずれかになるようにしたいです。 どうか教えてください。
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- piroin654
- ベストアンサー率75% (692/917)
すみません。少し単純なことに気が付きませんでした。 実際には、わざわざ「日付」を数値に変換する必要は ありませんでした。「日付」の比較に難儀したので 数値化したのですが、関数の中では直接比較できるので わざわざ「日付」を数値化する必要はなかったようです。 以下のコードをコード表に貼り付け、保存します。 「テーブル名」は実際に合わせて変更してください。 Function funcDateRank(ByVal dData As Date) As Long Dim db As DAO.Database Dim rs As DAO.Recordset Dim minNum As Long Dim i As Long Dim j As Long Dim strSQL As String '日付だけを取り出しグループ化 strSQL = "SELECT 日付 FROM テーブル名 GROUP BY 日付" Set db = CurrentDb Set rs = db.OpenRecordset(strSQL) '自分より大きい日付を見つける rs.MoveFirst Do Until rs.EOF If num < rs!dData Then i = i + 1 End If rs.MoveNext Loop 'レコード数の取得 j = rs.RecordCount 'ランクの算出 funcDateRank = j - i rs.Close: Set rs = Nothing db.Close: Set db = Nothing End Function 次にテーブルを基にクエリを作成します。 そのクエリの新しいフィールドに、 funcDateRank([日付]) と設定し、保存してください。 以上です。
- piroin654
- ベストアンサー率75% (692/917)
すみません。もう一つ。 Int((Format([日付],"yyyymmdd"))) は、 CLng((Format([日付],"yyyymmdd"))) のほうがいいのかもしれませんが、 Intでも対応できるので、Intにしています。 たびたびで。
- piroin654
- ベストアンサー率75% (692/917)
すみません、(2)のコードの中で、「Q123」を レコードデットとして使用していないので、コードは Function funcRank(ByVal num As Long) As Long Dim db As DAO.Database Dim rs As DAO.Recordset Dim i As Long Dim j As Long Dim strSQL As String '変換数値だけを取り出しグループ化 strSQL = "SELECT 変換数値 FROM Q123 GROUP BY 変換数値" Set db = CurrentDb Set rs = db.OpenRecordset(strSQL) '自分より大きい数値を見つける rs.MoveFirst Do Until rs.EOF If num < rs!変換数値 Then i = i + 1 End If rs.MoveNext Loop 'レコード数の取得 j = rs.RecordCount 'ランクの算出 funcRank = j - i rs.Close: Set rs = Nothing db.Close: Set db = Nothing End Function と、置き換えてください。あとは変更はありません。 そのままでも変わりはないのですが、無駄な記述に なるので除きます。 それと、 Dim minNum As Long も除きます。minNumも変数として使っていませんでした。 以上です。
- piroin654
- ベストアンサー率75% (692/917)
日付を数値型に変換して、いろいろやってみましたが、 面倒くさい(すみません)ので、関数で対処することに しました。 (1) テーブルをもとにクエリを作ります。クエリ名を「Q123」としておきます。 「テーブル名」は実際に合わせて変換してください。 新しいフィールドに、 変換数値: Int((Format([日付],"yyyymmdd"))) を設定します。クエリのSQLビューでは、以下のようになっていると 思います。 SELECT 日付, Int((Format([日付],"yyyymmdd"))) AS 変換数値 FROM テーブル名; 「日付」以外にフィールドがある場合はそのまま フィールドをクエリに設定してください。 (2) 次に、以下のコードを標準モジュールに貼り付け保存して ください。 なお、DAOを使っているのでコード表のツールから参照設定 を選択して、Microsoft DAO XX Object Library にチェックが 入っているか確認してください。XXは3.6あるいは4.0のような 数字です。 Function funcRank(ByVal num As Long) As Long Dim db As DAO.Database Dim rs1 As DAO.Recordset Dim rs2 As DAO.Recordset Dim minNum As Long Dim i As Long Dim j As Long Dim strSQL As String '変換数値だけを取り出しグループ化 strSQL = "SELECT 変換数値 FROM Q123 GROUP BY 変換数値" Set db = CurrentDb Set rs1 = db.OpenRecordset("Q123") Set rs2 = db.OpenRecordset(strSQL) '自分より大きい数値を見つける rs2.MoveFirst Do Until rs2.EOF If num < rs2!変換数値 Then i = i + 1 End If rs2.MoveNext Loop 'レコード数の取得 j = rs2.RecordCount 'ランクの算出 funcRank = j - i rs1.Close: Set rs1 = Nothing rs2.Close: Set rs2 = Nothing db.Close: Set db = Nothing End Function 本当はレコードの数が相当のものであれば、strSQL のところはクエリを作成しておいたほうがいいかも しれませんが、そのときにはstrSQLの中身 SELECT 変換数値 FROM Q123 GROUP BY 変換数値 でクエリを作成して、クエリをstrSQLの替わりにすればすむことです。 そのときは、 >Set rs2 = db.OpenRecordset(strSQL) を Set rs2 = db.OpenRecordset(クエリ名) とします。 (3) 次に、作成しておいたクエリをデザインビューで開き、 新しいフィールドに、 順位: funcRank([変換数値]) を設定してください。 (4) (1)、(2)、(3)をまとめますと、「Q123」をデザインビューで 開くと、 (A) 変換数値: Int((Format([日付],"yyyymmdd"))) (B) 順位: funcRank([変換数値]) フィールド 日付 (A) (B) テーブル テーブル名 並べ替え 表示 チェック チェック チェック 抽出条件 のようになっていると思います。 これでクエリを開いてみてください。
- nicotinism
- ベストアンサー率70% (1019/1452)
残念ながら、そちらの状況がサッパリです。 こんなテーブルの内容があって フィールド名A、フィールド名B、・・・・ ・・・・・ ・・・・・ こういう出力結果が欲しい。 フィールド名A、フィールド名B、・・・・ ・・・・・ ・・・・・ というのを『具体的に例示』されれば回答も増えるかと思いますよ。
補足
[日付] [順位] 2013/1/1 1 2013/1/1 1 2013/2/1 1 2013/3/15 2 2013/3/15 2 2013/3/20 3 このようになるといいのですが。