質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Q&A

解決済

2回答

6062閲覧

ACCESS 2013 RANK関数の代わりにDCOUNT関数を使ってグループごとに順位を出す

mnbwqz

総合スコア74

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

0グッド

0クリップ

投稿2021/10/23 10:04

編集2021/10/30 09:11

RANK関数を使った処理をしたかったのですが、
ACCESSではRANK関数が使用できないので、
代わりにDCOUNT関数を使ってグループごとに順位を出したいと思っています。
条件の指定の所が分からず困っています。
DCOUNT関数以外のものを使うのでしょうか?
よろしくお願いします。

テーブル1

ID
OSK01
OSK04
KOB01
KOB03
OSK02

※アルファベット3文字+数字2文字の固定

クエリ1

IDGROUP順位
OSK01OSK1
OSK04OSK3
KOB01KOB1
KOB03KOB2
OSK02OSK2

SELECT ID, Left([ID],3) AS [GROUP], DCount("ID","テーブル1", 条件部分?) AS 順位 FROM テーブル1;

※GROUPごとの順位を出したいです。
GROUPは、IDの最初の3文字が同じものになります。
よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

IDフィールドが主キーだったりインデックスが設定されているなら、
条件式内のIDフィールドは関数内にいれないほうがインデックスが使えるので
高速化が期待できます。

sql

1SELECT 2 ID, Left([ID], 3) AS [GROUP], 3 (select Count(*) 4 from テーブル1 5 where 6 [ID] Like Left([t1].[ID], 3) & "*" 7 And [ID] <= [t1].[ID] 8 ) AS 順位 9FROM 10 テーブル1 as t1;

件数が多くて上記でも重いという場合は、連番フィールドを追加してVBAでそこに入力するという方法も検討するといいでしょう。
下記で汎用関数を紹介していますのでご参考に。

グループ毎連番を自動入力する関数 - hatena chips

投稿2021/10/24 02:52

hatena19

総合スコア34075

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mnbwqz

2021/10/25 09:39

仰る通り、likeを使うと[ID]で関数を使わなくてよくなりますね。 気づきませんでした。アイデアをありがとうございました。 ACCESSではVBAが使えるので、 「グループ毎連番を自動入力する関数」を検討します。
guest

0

SQL

1SELECT ID, Left([ID],3) AS [GROUP] 2 , DCount("ID","テーブル1", "Left([ID],3)='" & Left([ID],3) & "' And " & "Mid([ID],4)<='" & Mid([ID],4) & "'") AS 順位 3FROM テーブル1;

Dcount()は低速なので、その場合サブクエリーにすると概ね改善されます。

SQL

1SELECT ID, Left([ID],3) AS [GROUP] 2 , (select Count(*) from テーブル1 3 where Left([ID],3) = Left([t1].[ID],3) 4 And Mid([ID],4)<= Mid([t1].[ID],4) 5 ) AS 順位 6FROM テーブル1 as t1;

投稿2021/10/23 10:16

編集2021/10/23 10:22
sazi

総合スコア25327

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mnbwqz

2021/10/25 09:33 編集

ありがとうございます。 1番目のDCOUNT関数、動きました。 確かにおっしゃる通り遅いですね。 2番目のサブクエリも動作しました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問