一回も披露したことのない豆知識

ACCESS2007 + Win7Pro

選択クエリで[日付]フィールドを昇順でソートした場合¥の順位を
[日付順位]フィールドに出るようにしたいのですが、
[日付]が重複している場合、例えばレコード数が30個で、
2013/1/1、2013/5/20、2013/11/6の3種類しか存在しないときは、
1、2、3のいずれかになるようにしたいです。

どうか教えてください。

A 回答 (5件)

すみません。

少し単純なことに気が付きませんでした。
実際には、わざわざ「日付」を数値に変換する必要は
ありませんでした。「日付」の比較に難儀したので
数値化したのですが、関数の中では直接比較できるので
わざわざ「日付」を数値化する必要はなかったようです。


以下のコードをコード表に貼り付け、保存します。
「テーブル名」は実際に合わせて変更してください。


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([日付])

と設定し、保存してください。

以上です。
    • good
    • 0

すみません。

もう一つ。

Int((Format([日付],"yyyymmdd")))

は、

CLng((Format([日付],"yyyymmdd")))

のほうがいいのかもしれませんが、
Intでも対応できるので、Intにしています。

たびたびで。
    • good
    • 0

すみません、(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も変数として使っていませんでした。


以上です。
    • good
    • 0

日付を数値型に変換して、いろいろやってみましたが、


面倒くさい(すみません)ので、関数で対処することに
しました。



(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)
テーブル   テーブル名
並べ替え
表示      チェック     チェック   チェック
抽出条件

のようになっていると思います。


これでクエリを開いてみてください。
    • good
    • 0

残念ながら、そちらの状況がサッパリです。


こんなテーブルの内容があって
フィールド名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

このようになるといいのですが。

補足日時:2013/12/06 14:54
    • good
    • 0

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

関連するカテゴリからQ&Aを探す