No.4ベストアンサー
- 回答日時:
データにどのようなパターンがあるかによって、必要になる式が
全く違ってきてしまいますが・・・(汗)
とりあえず、全てが「英字(字数不定)」+「-」+「数字(字数不定)」の
パターンであるなら、以下のようなSQLでいけます:
(使用アプリケーションがAccessで、テーブル名が「tbl_商品」、
並べ替えを行うフィールドの名前が「商品名」としての例)
Select * From tbl_商品
Order by Left([商品名], InStr(1, [商品名], "-")-1), CLng(Mid([商品名], InStr(1, [商品名], "-")+1));
【解説】
まず、InStr関数で「商品名」の中の「-」の位置を割り出します。
これをLeft関数の引数と使用して、「-」の手前まで(→「InStr(~)-1」)
で切り出したのが、Order By句の1条件目の式です。
次に、数値部分も同様に、今度は「-」の次から(→「InStr(~)+1」)の
切り出しになりますが、これにはMid関数を使用します。
但し、Mid関数で切り出しただけでは文字列扱いとなってしまうので、
これをCLng関数を使用して数値化します。
(なお、もしも数字部分が小数もありえるなら、CLng関数の代わりに
CDbl関数を使用する必要があります)
これがOrder By句の2条件目になります。
※上記のパターンのデータしかないことが前提の式です。
このパターンに合わないデータがある(「ABC123」など)場合は、
「プロシージャ呼び出しが正しくありません」とのエラーが発生
しました(汗)
No.3
- 回答日時:
どのDBを使用されているかにもよりますが、
MySQLであれば下記のようなクエリで
数値として並べ替えができるかと思います。
ただし、「AB-125」のように必ず4文字目から数値が始まる場合に限り、
更に数値の前の文字列は無視されてしまいます^^;
SELECT * FROM mytable ORDER BY CAST(SUBSTRING(goods, 4) AS SIGNED);
テーブル名や、カラム名は実装に合わせて変更して下さい。
この回答へのお礼
お礼日時:2010/05/24 17:54
アドバイスありがとうございます。
必ず4文字目という訳ではないので、少しリスキーですね。
しかし、参考になりました。
ありがとうございました。
No.2
- 回答日時:
回答欄の文字数が尽きたので、続き。
商品番号を10倍しているのは、前の回答の通り。
商品番号に200000を足しているのは「特別な並びにしたい商品が出てきた時の為」です。
例えば「キャンペーン用の商品を先頭にしたい」とか「廃番商品は必ず末尾にしたい」とかの場合に、頭の「2」を「1」に変えたり「9」に変えたりするのです。
AB-11
AB-45
を廃番にして
AB-123
AB-125
の2つを先頭に持って行きたい場合は、以下のようにソート順を書き換えます。
品名 ソート順
AB-5 200050
AB-9 200090
AB-11(廃) 900110
AB-22 200220
AB-45(廃) 900450
AB-123 101230
AB-125 101250
これを「ソート順」でソートすると
品名 ソート順
AB-123 101230
AB-125 101250
AB-5 200050
AB-9 200090
AB-22 200220
AB-11(廃) 900110
AB-45(廃) 900450
のようになります。
上記の例では、頭の番号は一桁ですが、2桁でも3桁でも構いません。
うまく付番すれば「百万の桁はこの意味で、この順番。十万の桁はこの意味で、この順番」など、色々と出来ます。
このように、商品番号に200000を足す事で「あとから、前に移動したり、後ろに移動したり」が出来るのです。
下手に1番から使ってしまうと、1番の前には0番しか入れられないので、後で困ります。
この回答へのお礼
お礼日時:2010/05/24 17:56
非常に長い説明分ありがとうございました。
大変参考になりました。
桁数を上げて、調整するという考えもあるのですね。
ありがとうございました。
No.1
- 回答日時:
"AB-125"
"AB-123"
"AB-20"
などのデータは「すべて文字列」なので「1文字づつ、文字コード順で大小比較」されます。
大小比較は「最初に異なる1文字」で比較されます。
どれも3文字目までは同一なので、最初の比較は「4文字目のみ」を使って行われます。
"AB-125"
"AB-123"
の2つは「4文字目が"1"」なので「4文字目が"2"」になっている
"AB-20"
よりも小さいと判断されます。
なので「最も大きいのは"AB-20"」です。
"AB-125"
"AB-123"
の2つを比べた場合「5文字目までは同一」なので「6文字目のみ」を使って大小比較します。
「"3"は"5"よりも小さい」ので「"AB-123"の方が小さい」と言う事になります。
結果、文字列として並び替えると
AB-123
AB-125
AB-20
の順番になります。
データベースで「商品コード」などのような「英字と数字を組み合わせたコード」を付番してソートしたい場合は「数字部分の文字位置を右詰めにする」と言う配慮が必要です。
例えば
「ABタイプの5番」⇒「AB-005」
「ABタイプの9番」⇒「AB-009」
「ABタイプの11番」⇒「AB-011」
「ABタイプの22番」⇒「AB-022」
「ABタイプの45番」⇒「AB-045」
「ABタイプの123番」⇒「AB-123」
「ABタイプの125番」⇒「AB-125」
などのように付番しなければなりません。
これを
「ABタイプの5番」⇒「AB-5」
「ABタイプの9番」⇒「AB-9」
「ABタイプの11番」⇒「AB-11」
「ABタイプの22番」⇒「AB-22」
「ABタイプの45番」⇒「AB-45」
「ABタイプの123番」⇒「AB-123」
「ABタイプの125番」⇒「AB-125」
と付番すると、ソートした時に
「ABタイプの11番」⇒「AB-11」
「ABタイプの123番」⇒「AB-123」
「ABタイプの125番」⇒「AB-125」
「ABタイプの22番」⇒「AB-22」
「ABタイプの45番」⇒「AB-45」
「ABタイプの5番」⇒「AB-5」
「ABタイプの9番」⇒「AB-9」
という順番になってしまいます。
「名前やコードを今更変えられない」と言う場合は、新たな「ソート用の順番テーブル」を作成して対処します。
例えば、ソート用テーブルに「品名(文字列型)」と「ソート順(長整数型)」と言う項目を持たせ
品名 ソート順
AB-5 200050
AB-9 200090
AB-11 200110
AB-22 200220
AB-45 200450
AB-123 201230
AB-125 201250
と言うテーブルを作っておきます。
そして、このテーブルをJOIN句で連結し「ソート順」をORDER BY句に指定しましょう。
なお、ソート順が「商品番号を10倍して200000を足した数」になっているのには理由があります。
もし
AB-9
AB-10
の間に
AB-9S
を増やして
AB-9
AB-9S
AB-10
にしたい場合があったら?
仮に「ソート順」が
AB-9 20009
AB-10 20010
だったら「20009」と「20010」の間に来る数値を入れられません(項目は長整数型ですから小数点は入りません)
なので、10倍した番号にしておいて
AB-9 200090
AB-9S 200095
AB-10 200100
のように、間に番号を増やすのです。
当然ですが
AB-9 200090
AB-9S1 200091
AB-9S2 200092
AB-10 200100
と言う増やし方は、やってはいけません。
続き番号で間に増やすと、以下のように、間に新商品を増やせません。
AB-9 200090
AB-9N1 番号に間があいてないので増やせない
AB-9S1 200091
AB-9S2 200092
AB-10 200100
後ろの枝番と違ってしまい、ちょっと違和感があるかも知れませんが、必ず間をあけて
AB-9 200090
AB-9N1 200092
AB-9S1 200095
AB-9S2 200097
AB-10 200100
のように追加していきましょう。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Oracle 質問です。 下記のテーブルとデータがあり、 取得想定結果のように出力したいです。 下記のsqlだと0 2 2023/05/23 19:10
- SQL Server SQLのクエリの書き方 1 2022/03/29 23:06
- Oracle sqlで質問です。 idを元にidに紐付くデータで住所コードがjpのみのデータ以外のidを取得したい 4 2023/03/20 17:41
- Excel(エクセル) エクセルでのマクロを使ったデータの並べ替え 3 2022/12/03 18:54
- SQL Server これをSQL文で出来るでしょうか? 1 2023/03/26 02:16
- Excel(エクセル) マクロを簡潔にしたい 6 2022/09/16 10:37
- MySQL 複数DBテーブルからのデータ取得 3 2022/05/17 15:02
- Excel(エクセル) Excel同士のデータの突合 3 2023/08/07 16:34
- その他(Microsoft Office) 1の行を固定した上でVBAを用いて日付順に自動並べ替え 2 2022/06/06 15:09
- Excel(エクセル) エクセルデーターの並び替え 5 2022/08/06 09:59
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
- ・お風呂の温度、何℃にしてますか?
- ・とっておきの「まかない飯」を教えて下さい!
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・いけず言葉しりとり
- ・土曜の昼、学校帰りの昼メシの思い出
- ・忘れられない激○○料理
- ・あなたにとってのゴールデンタイムはいつですか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
検索結果を指定件数ずつ抽出表...
-
レコードの登録順がおかしい
-
ファイルの漢数字の順番につい...
-
並べ替えについて
-
EXCELで4項目以上で並べ替えを...
-
上から何番目か。
-
エクセル、並び替え正しくソー...
-
コンボボックスのソートについて
-
<SQL>重複しているデータの場合...
-
テーブルのフィールドの一番長...
-
2回実行のSQL文を1回にしたい
-
BLOBやCLOBのパフォーマンスを...
-
「数字で始まらない」ものを抽...
-
select文の実行結果に空白行を...
-
oracle 2つの列の比較
-
SQL文 複数実行
-
【SQLサーバ】float型における...
-
単一グループのグループ関数で...
-
BLOB型項目をSQLの検索条件に指...
-
OUTER JOIN とgroup by
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ファイルの漢数字の順番につい...
-
並べ替えについて
-
エクセル、並び替え正しくソー...
-
レコードの登録順がおかしい
-
月末日のみソートしたい
-
accessでDISTINCT 句と矛盾
-
テーブルレーコードをソートし...
-
エクセルの縦列のソートできま...
-
Selectした時のレコードの取得順
-
SQLで曜日のソートを月火水木金...
-
OracleとAccessの出力順の違い
-
アクセスに関して。クエリの並...
-
1の行を固定した上でVBAを用い...
-
ハイフンの入ったデータの並べ替え
-
文字型の順番がうまく並ばない。
-
都道府県順、北からソートした...
-
上から何番目か。
-
SQLのORDERBY句について質問です。
-
コンボボックスのソートについて
-
Excelのオートフィルタでソート...
おすすめ情報