Accessクエリで並べ替えする方法 複数条件と順番が変わる原因

概要

この記事の結論
Accessのクエリで並べ替えるには、デザインビューの[並べ替え]行で昇順・降順を指定します。複数条件は左側の列が優先され、SQLではORDER BYに書いた順に適用されます。同じ値がある場合は最後に一意なIDを加え、保存後に開き直して確認しましょう。数字の順番がおかしい場合はデータ型、レポートだけ違う場合はレポート側の設定も調べます。
クエリの並べ替えとは、取得したレコードを指定した項目と方向に従って表示する処理です。

この記事でわかること

  • 昇順と降順を項目ごとに指定する
  • 複数条件は左側から優先する
  • 同じ値の順序は一意なIDで確定する
  • 表示列順と行の並び順を分ける
  • 出力先でも並び順を確認する

この記事の主な内容

  1. 並べ替えの基本と変更される範囲
  2. デザインビューで並べ替えを保存する
  3. 複数条件と表示列の順序を分けて設定する
  4. ORDER BYで順序と空欄の位置を制御する
  5. 並べ替えがおかしいときの確認順
  6. 帳票やCSVへ同じ順番で渡すための確認
  7. よくある質問

想定読了時間:約14分~18分


並べ替えの基本と変更される範囲

クエリで並べ替えると、取り出したレコードの表示順を決められます。商品名なら文字の順、数量なら数の大小、売上日なら日付の前後を指定します。選択クエリの並べ替えそのものは、元テーブルの売上日や金額を書き換える操作ではありません。

ただし、並べ替えた結果画面で値を直接編集すると、更新可能なクエリでは元テーブルに反映されます。「並べ替えは表示の操作だから、結果画面で何をしても安全」とは考えないでください。既存業務で使うクエリは複製し、元の設定へ戻せる状態で作業します。

昇順と降順を具体例で理解する

対象昇順降順
数値型の数量1、2、1010、2、1
日付/時刻型の売上日古い日付から新しい日付新しい日付から古い日付
短いテキストの商品名設定された文字の照合順その逆順

文字の順序はデータベースの照合順序などの影響を受けます。漢字の顧客名を並べても、必ず読みの五十音順になるわけではありません。読み順が業務要件なら、フリガナを別フィールドへ保存し、その列で並べる設計を検討します。

テーブルに保存された値は変えず、クエリで行の表示順を指定する関係

テーブルの保存順と帳票の印刷順を混同しない

Accessでは「何行目へ保存されたか」を表示順の仕様にしません。毎回同じ順で一覧を見せたい場合は、クエリに並べ替え規則を保存します。さらに、レポートには独自のグループ化・並べ替え設定があるため、クエリの結果と帳票の出力順を別々に確認します。[1][5]


デザインビューで並べ替えを保存する

基本操作は、並べ替えたい列の[並べ替え]行へ昇順または降順を設定することです。ここでは架空の「T_売上」を使います。売上IDは一意な長整数、売上日は日付/時刻型、金額は通貨型とし、次の4件を例に説明します。

売上ID売上日金額
1012026/10/013000
1022026/10/015000
1032026/10/021000
1042026/10/015000

新規クエリを作成する手順

1. [作成]から[クエリデザイン]を開き、T_売上を追加します。既存クエリを使う場合は、コピーをデザインビューで開きます。
2. 売上日、金額、売上IDの各フィールドを、下側のデザイングリッドへ追加します。
3. 売上日の[並べ替え]行で[昇順]を選びます。抽出条件の行に「昇順」と入力する操作ではありません。
4. [表示]からデータシートビューへ切り替え、日付の順序を見ます。選択クエリでは[実行]でも結果を確認できます。
5. 「Q_売上一覧」のような名前で保存し、一度閉じて開き直します。

売上日だけを指定した段階では、10月1日の3件が先、10月2日の1件が後に来れば日付順として正しい状態です。同じ10月1日の中で、どの売上IDが先に来るかまでは、この設定だけでは決まりません。

対象クエリをデザインビューで開き、並べ替えを設定して保存する手順

並べ替えを解除したいとき

保存した規則を外すにはデザインビューへ戻り、対象列の[並べ替え]を[並べ替えなし]にします。複数列へ設定している場合は、不要な列すべてを確認します。データシート上で一時的な並べ替えを解除することと、設計に保存したORDER BYを変更することは区別しましょう。


複数条件と表示列の順序を分けて設定する

複数の項目へ並べ替えを指定すると、デザイングリッドでは左側の条件が優先されます。第1条件で同じ値だった行を第2条件で並べ、そこでも同じなら第3条件を使います。すべての列を独立して並べるのではなく、条件を順番に適用する仕組みです。

同じ日付は金額順にし、同額ならID順にする

左から「売上日=昇順」「金額=降順」「売上ID=昇順」の順で設定します。先ほどの例の期待結果は、売上IDが102、104、101、103です。10月1日の中で5000が先になり、同じ5000の2件はIDの小さい102が先になります。

売上日、金額、売上IDの順で並べ替えの優先順位を決める考え方

一意なIDを最後の条件に加えると、他の値が同じでも順序を確定できます。ただし、IDが同じ行が複数出る結合クエリでは、それだけでは一意になりません。その場合は明細IDなど、結果の1行を識別できるキーを追加します。IDは業務上の優先順位ではなく、同順位を解消するための条件です。

表示する列の順番を変えずに並べる

画面には「売上ID、売上日、金額」の順で見せたい一方、並べ替えは売上日から始めたい場合があります。通常の選択クエリなら、表示用の列に加えて並べ替え専用の列を追加し、専用列の[表示]チェックを外す方法が使えます。

1. 表示用の売上ID、売上日、金額を希望する列順に置きます。
2. その3列の[並べ替え]設定を外します。
3. 右側へ売上日、金額、売上IDをもう一度追加します。
4. 追加した3列は[表示]をオフにし、昇順、降順、昇順を指定します。
5. データシートで列順と行順の両方を照合します。

表示用の列と非表示の並べ替え用の列を分ける考え方

非表示にした列でも、条件指定のためにクエリ内部では使用されます。これは閲覧者から情報を保護するセキュリティ機能ではありません。また、集計クエリやDISTINCTなどでは参照できる列に条件があるため、同じ方法を無条件に当てはめず、SQLと結果を確認してください。


ORDER BYで順序と空欄の位置を制御する

SQLビューでは、SELECTで表示列、ORDER BYで行の順序を分けて指定できます。ASCは昇順、DESCは降順です。以下は表示列を売上ID、売上日、金額の順に保ちながら、日付・金額・IDで並べる例です。[1]

SELECT [売上ID], [売上日], [金額]
FROM [T_売上]
ORDER BY [売上日] ASC, [金額] DESC, [売上ID] ASC;

ORDER BYで項目ごとの昇順と降順を指定する方法

条件は各フィールドへ書く

DESCを最後に一つ書くだけで、すべての項目が降順になるわけではありません。上の例では金額だけが降順です。ASCは省略できますが、引き継ぎや見直しを考えると、方向をすべて明示した方が意図を読み取りやすくなります。

Nullを最後にまとめる

Nullは値が入っていない状態です。日付昇順の先頭に未入力が並ぶと都合が悪い場合は、入力済みを0、Nullを1とする補助条件を最初に置きます。その後で日付、最後にIDを指定します。次の例は日付/時刻型の売上日が対象です。

SELECT [売上ID], [売上日], [金額]
FROM [T_売上]
ORDER BY IIf([売上日] Is Null, 1, 0) ASC,
         [売上日] ASC, [売上ID] ASC;

この例は元の日付を書き換えません。文字列の項目にはNullとは別に空文字「””」や空白だけの値があり得ます。どれを未入力として扱うかを決め、対象データを調べてから判定式を設計してください。数値型へとりあえず変換する処理も、元データを壊さないコピーで確認します。

未入力の日付を判定用の順序キーで最後にまとめる方法

クエリの並び順と帳票の不一致を相談する

基本設定は、まずコピーしたクエリやレポートで試してください。複数の帳票や既存処理にまたがって不一致が出る場合は、対象名、操作手順、期待する結果、実際の結果を整理すると調査しやすくなります。Accessの教科書の問い合わせ窓口から、現在の状況をご相談ください。


並べ替えがおかしいときの確認順

期待どおりに並ばないときは、並べ替え方向を何度も切り替える前に、データ型と設定対象を確認します。見た目が同じでも、文字列の「10」と数値の10では並び方が異なります。日付に見える文字列も、日付型として保存されているとは限りません。

数字が1、10、2と並ぶ場合

短いテキスト型の数字は文字として比較されます。数量や金額を大小で並べるなら数値型や通貨型が基本です。一方、「0012」のように先頭の0が必要なコードは、数量とは別の扱いです。安易に数値へ変換するとコードの意味が失われるため、コード列と並べ替え用の順序列を分ける方法もあります。

文字列と数値で並び方が変わり、日付は日付型で並べる必要があること

日付は表示用の文字列ではなく元の値で並べる

Format関数で日付を「m/d」などの文字列にした列は、日付順を保証するためのキーには向きません。表示は見やすく整えても、並べ替えには元の日付/時刻型を使います。時刻が保存されている場合、同じ日付に見える行でも内部では午前・午後の順で差が付くことがあります。[4]

症状最初に確認する場所対処の方向
数字が1、10、2となる元テーブルのデータ型数値なのかコードなのかを判断する
同じ値の順番が変わる最後の並べ替え条件結果の1行を識別できるIDを加える
日付順が不自然Format、文字列の日付、時刻元の日付型で並べ、時刻も確認する
保存しても順番が違うSQLと表示側の並べ替え保存対象と一時的な設定を切り分ける
帳票だけ順番が違うレポートのグループ化と並べ替え帳票側へ同じ優先順を設定する
パラメーター入力が出るフィールド名、別名、元クエリ誤記や削除された列の参照を直す

独自の順序は順序列で管理する

「未着手、処理中、完了」の順は、文字の昇順と一致するとは限りません。状態マスターへ表示順を1、2、3で持たせ、結合したクエリでその列を並べ替えに使うと、業務上の順序を説明しやすくなります。少数の固定条件なら式でも実現できますが、状態が増える運用ではマスター管理が候補です。[3]


帳票やCSVへ同じ順番で渡すための確認

クエリで正しい順番になっても、利用先が独自に並べ替える場合があります。完成判定はクエリだけでなく、実際に使うフォーム、レポート、CSVまで含めて行います。変更前後の件数と金額も照合し、並べ替え以外の抽出条件や結合まで変えていないかを確認します。

保存後に確認する4つのテスト

1. クエリを閉じて開き直し、設定した順序が残っているか見ます。
2. 同じ日付・同じ金額を含むデータで、IDまで順序が定まるか確認します。
3. Nullや時刻付きの日付を含め、例外の位置を確かめます。
4. 本番と同じ操作で帳票とCSVを出し、先頭・末尾・同順位の部分を照合します。

クエリを開き直し、同順位、空欄、帳票やCSVの出力順を照合する項目

レポートへ渡す場合は、レポート側の[グループ化と並べ替え]を確認します。CSVは保存クエリを出力元にしたうえで、出力されたファイルを開いて順序を見ます。別のプログラムが読み直すなら、そのプログラムで再ソートしていないかまで確認すると、原因の所在を整理できます。

大量データで遅くなる場合は、必要な行を先に抽出し、並べ替え列のインデックスや式の利用を調べます。関数で加工した値の並べ替えは、元の列をそのまま使う場合より負荷が増えることがあります。性能改善のために業務上必要な順序を省くのではなく、対象件数と処理時間を測って見直します。

まとめ

Accessクエリの並べ替えは、デザインビューの[並べ替え]行かSQLのORDER BYで指定します。複数条件では優先順位を明示し、同じ値が並ぶ場合は結果の1行を識別するIDを最後に加えます。表示する列順と行の順序を分けて考えることも大切です。

数字・日付・Nullの扱いを確認し、保存後の再表示と実際の出力先で照合してください。順序変更の前後で件数や金額が変わっていないことまで確認すると、単なる見た目の調整に終わらず、業務で再利用できる一覧になります。


よくある質問

選択クエリで並べ替えるだけなら、元テーブルの値は変わりません。変わるのは取得した行の表示順です。ただし、更新可能なクエリの結果画面で金額や日付を編集すると、元データへ反映されます。確認作業では並べ替え設定だけを変更し、値の入力や削除をしないようにしましょう。既存業務のクエリは先にコピーし、変更前後の件数と合計を照合すると、他の条件まで誤って変えていないか判断できます。

デザインビューでは、並べ替えを設定した列のうち左側の列が優先されます。SQLならORDER BYに書いた順です。例えば日付昇順、金額降順、ID昇順なら、日付が同じ行の中で高額を先にし、同額ならIDで順序を決めます。結果画面の列見出しを左右へ動かすことと、設計上の優先順位は区別してください。列の表示順を維持したい場合は、非表示の並べ替え専用列かSQLで条件を整理します。

数字が短いテキスト型などの文字列として保存されている可能性があります。数値の大小ではなく文字として比較されるため、10が2より先になる場合があります。まず元テーブルのデータ型と、クエリで文字列へ変換していないかを確認してください。ただし、商品コードの0012などは数値化すると先頭の0を失います。数量は数値、識別コードは文字列という用途の違いを整理し、必要なら専用の表示順列を設けます。

日付だけでは同じ値の行どうしの順序が確定しないため、次の条件として金額やIDを追加します。最後に一意なキーを指定すると、他の条件が同じでも順番を決められます。結合クエリでは売上IDが複数行に現れることもあるので、明細IDなど結果の1行を識別できる項目を選んでください。また、日付に時刻が含まれる場合は、同日に見えても値が異なります。必要な並べ方が日単位か時刻単位かも確認しましょう。

対象が日付型などでNullを持つ場合は、Nullなら1、入力済みなら0を返す補助式を最初の昇順条件に置き、その次に日付やIDを指定します。こうすると、元の値を変更せずに入力済みの行を先へ出せます。本文のIIfとIs Nullの例を参考に、コピーしたクエリで確認してください。文字列ではNullのほか空文字や空白もあり得ます。見た目が空欄というだけで同じ状態と決めず、どれを末尾へ回すかを先に定義します。

設計に保存した並べ替え規則と、データシートやフォーム側の一時的な並べ替えが混在している可能性があります。まず対象クエリのデザインビューとSQLビューで、意図した条件が残っているか確認します。そのうえで、開いているフォームのOrderByや起動時のマクロ・VBAを調べます。同値の順序だけが変わる場合は、保存の問題ではなく最終キーが不足していることもあります。どの画面から開いたかを揃えて再確認しましょう。

レポートは独自のグループ化・並べ替えを持つため、元クエリが正しくても印刷順が一致するとは限りません。レポートをデザインビューで開き、[グループ化と並べ替え]の優先順位と昇順・降順を確認してください。顧客ごとのグループ化があれば、その中での明細順も設定します。フォームやVBAから開く処理で設定を変更している場合もあるため、本番と同じ操作で印刷プレビューを出し、先頭と末尾を照合すると切り分けやすくなります。

通常の選択クエリでは、並べ替え専用の列を追加して[表示]を外す方法が使えます。表示用の列はそのまま残し、専用列だけに優先順と方向を設定すると、列順と行順を分けられます。ただし、集計やDISTINCTを使うクエリでは参照できる列に制約があるため、同じ方法が使えるかSQLを確認します。また、非表示はデータ保護ではありません。機密情報を見せない要件なら、クエリの列選択だけでなく権限も含めた設計が必要です。

クエリの並び順と帳票の不一致を相談する

基本設定は、まずコピーしたクエリやレポートで試してください。複数の帳票や既存処理にまたがって不一致が出る場合は、対象名、操作手順、期待する結果、実際の結果を整理すると調査しやすくなります。Accessの教科書の問い合わせ窓口から、現在の状況をご相談ください。


関連記事

Accessのクエリとは

Accessレポートで並べ替えする方法

Accessクエリで連番を作成する方法

Accessのデータ型不一致を解消する方法

参考情報

[1] Microsoft Support ORDER BY Clause
https://support.microsoft.com/en-us/access/order-by-clause

[2] Microsoft Support 値による並べ替え
https://support.microsoft.com/en-us/access/sort-records-on-text-numeric-or-date-values

[3] Microsoft Support 独自の順序で並べ替え
https://support.microsoft.com/en-us/access/sort-records-in-custom-order

[4] Microsoft Support Format関数
https://support.microsoft.com/en-us/access/functions/format-function

[5] Microsoft Support OrderByプロパティ
https://support.microsoft.com/en-us/access/orderby-property

TOP