• ベストアンサー

SQL ORDER BY の結果について

SQLのORDER BYの結果表示がおかしく困っています。 テーブル名:社員名簿 プライマリーキー無し (設定厳禁) フィールド: | 社員ID | 氏名 | 住所 | | VARCHER|VARCHER|VARCHER| | P1 | 田中 |東京都 | | P2 | 鈴木 |東京都 | | P10 | 高橋 |千葉県 | SQL文: SELECT * FORM 社員名簿 ORDER BY 社員ID 出力結果: | 社員ID | 氏名 | 住所 | | P1 | 田中 |東京都| | P10 | 高橋 |千葉県| | P2 | 鈴木 |東京都| 上記のような出力結果となってしまいます。 何か良い方法はありませんか? よろしくお願いします

質問者が選んだベストアンサー

  • ベストアンサー
  • kmor
  • ベストアンサー率27% (225/825)
回答No.2

No.1の方と同じです。 補足しますと、並び替えのルールとして、まず1桁目をソートし、次に2桁目をソートする、と言うふうに考えるとわかりやすいと思います。 P1,P2,P10とあると、まず、1桁目のPでソートとし、(この場合全て同じですね)、次に2桁目で1(P1),1(P10),2(P2)とソートします。 ですから、最大桁を見込み、0を埋めるようにしないといけません。 P0001と言った感じです。

その他の回答 (3)

  • --neiro--
  • ベストアンサー率15% (22/139)
回答No.4

#1さん達の仰られるとおり、データベースの構造を変えられた方が良いと思いますが、データベースを作り直す事が出来ない場合の(既存データが既に存在したり)矯正手段として以下参考にお読み下さい。 Order By で、[社員ID] ではなく、[LPAD(社員ID,5,' ')]としてみては? スペースが社員IDのコード長5になるように挿入されますので。 ただし、データベースがオラクルであった場合なのですが(^^;

  • ssm3u
  • ベストアンサー率52% (19/36)
回答No.3

charactor に対するorder byである限り P10の方がP2より前にくるのは当然です。 (同様の現象でしたら エクスプローラでも確認できます) (P1,P2,P10というファイルを作ってソート) P01, P02, P10 とするか 社員区分|社員ID char(varchar)|smallint等 P|1 P|2 P|10 として order by 社員区分, 社員IDとする。 後者の方がDB設計として良いと思いますが・・・

  • taknt
  • ベストアンサー率19% (1556/7783)
回答No.1

これは、そうなると思います。 つまり、数値としてのソートではなく、文字列としてソートになるからです。 あ あい い いい と いう順で並ぶのが 正しいでしょう。 これと同じことです。 数値として並ばせるならば P01 P02 P10 と 0をつけて 補ってあげないとダメです。 か もしくは Number型にするかのどちらかですね。

関連するQ&A

  • SQL Server:取得結果Order Byについて

    SQL Server7.0なのですが、自分の環境では取得結果はテーブルのプライマリーキー昇順で暗黙のOrder Byがかかっているように動きます。 でもリリース先ではこのOrder Byが働かずバラバラな取得結果となっていてトラブルになりました。対処としては明示的にOrder Byを記述して直ったのですが、自分の環境で暗黙に並べ変わっているのはどうしてでしょうか?

  • T-SQL: Order By の使い方

    (別のCategoryに載せてしまいましたがみつかりませんので、正しいCategoryで再掲載しています。) T-SQL: Order By の使い方について (初心者です) 下のような順番で結果を求めています。 Item NO QTY P001    10 P002      8 P003    20 N001    13 N002    50 Q001    5 Q002    33 Q003     6 Table内のItemNOはA001から alphabetと3桁番号の順番でY005まであるものとして、上記のP,N,QのItemNoのものだけをこの順番で求めたいのです。 もちろん、WHERE-clauseにはこの8件のItemNOの指定はしてあります。 Order by left(ItemNO, 1) DESC (またはASCE), substring(ItemNo, 2,4) ASC これでは、P,N,Qの順番にはなりません。 最初にP Number、次にN Number、最後にQ Numberを出すにはどうしたらいいのでしょうか。 Order Byの次に8個のItemNOを上記の順番に書いて指定することはできるのでしょうか。 Order Byには "Case When" が使えるとあるinternetで見たのですが、もし使えるとしたらこの順番をだすのに使えるのでしょうか。 ご指導お願いいたします。

  • SQL ORDER BY句に別名を指定

    SQL初心者です。 よろしくお願い致します。 Oracle SQLのORDER BY句で日本語の別名と英字の別名とでは処理速度が変わるのでしょうか。 例えば、給与から控除額を引いて税抜き給与支給額の多い順に並べたい場合に 以下のようなSQLを検討しました。 ORDER BY句にはSELECT内の計算結果の別名を指定しました。 その結果、処理が遅くなる感じがしました。 代わりに、"税抜き給与支給額"をSIKYU_GAKと英字にすると早くなった気がしました。 日本語の別名と英字の別名とでは処理速度が異なるものでしょうか。 SELECT t1.ID AS "社員ID" ,t1.NAME AS "社員名" ,t1.KYUYO AS "給与" ,t1.ZEI AS "税金" ,t1.OTHER AS "その他" ,(t1.KYOYO - t1.ZEI - t1.OTHER) AS "税抜き給与支給額" FROM 社員 t1 ORDER BY "税抜き給与支給額"

  • 2個のカラムに対して、ORDER BYをする方法

    タイトルの通りなのですが picture_idとgrp_idは連番になっているのですが どちらか片方に対して、ORDER BYを行った場合 もう一方の連番が崩れてしまいます。 FROM区で、2つのカラムに対して ORDER BY ASC をする方法はあるのでしょうか? SELECT p.picture_id, p.grp_id, FROM hogehoge_info AS p WHERE ORDER BY p.picture_id ASC ORDER BY p.grp_id ASC 知っている方、いらっしゃいましたら ご教授お願い致します。

    • ベストアンサー
    • MySQL
  • SQLで条件指定結合をしたいがNULLも表示したい

    こんにちは、ちょっと複雑なSQLの結合で困っています。 次のような名簿テーブルがあります。 ID, Name, IsMarried 1, 田中, True 2, 鈴木, True 3, 高橋, False 4, 中村, True 「IsMarried」は結婚しているかどうかを示しています。 そして、次のような属性テーブルがあります。 ID, ParentID, Type, Value 1, 1, 1, 55kg 2, 1, 2, 170cm 3, 1, 3, AB型 4, 2, 1, 52kg 5, 2, 2, 165cm 6, 3, 3, B型 7, 4, 1, 45kg 8, 4, 2, 180cm ParentIDは、名簿テーブルのIDに対応しています。 Typeは、1が体重、2が身長、3が血液型です。 Valueに実際の値が入っています。 ここで、「既婚者」を全員抽出して、"登録されている場合は"その血液型を表示するSQLを書きたいのですが、うまく行きません。どうしたらよいでしょうか? 結果は次のようになります。 ID, Name, BllodType 1, 田中, AB型 2, 鈴木, null 4, 中村, null Select 名簿.ID, 名簿.Name, 属性.Value from 名簿 [Inner/Left] Join 属性 on 名簿.ID = 属性.ParentID Where 名簿.IsMarried = True AND 属性.Type = 3 このようにすると、血液型が登録されている田中さんしか表示されません。 条件指定を外すと体重や身長も表示されます。 ExcelのVBAからADODBでAccessのmdbファイルにアクセスしています。 Windows 7 64bit、Office 2007です。

  • mysql order by のNULLについて

    mysql order by のNULLについて テーブル tb1 memberid 2   2 cardid  1   1 name 田中  井岡 day 2016.4.10  2016.4.22 new  New NULL ソース SELECT memberid,cardid,max(name),max(day),max(new) FROM tb1 WHERE memberid=2 GROUP BY cardid ORDER BY max(day) DESC LIMIT '.$limit.' OFFSET '.$offset; すると max(new)の部分が Newと出てきます。 max(new)なのでNULLが出てくると思っていました。 NULLにしたいのですが 名前も井岡ではなく田中がでてきます max(day)をオーダーしているので新しい日の情報が出てくると思っていましたが。。。。 何か SQLの書き方に問題があるのでしょうか それともこのテーブルの作りでは不可能なのでしょうか? 無知な私に ご教授お願いいたします。

    • ベストアンサー
    • MySQL
  • SQLの問題です。

    以下のような二つのテーブルがあります。 社員テーブル 社員番号 社員氏名 1     花子 2     太郎 所属テーブル 社員番号 所属番号 1     10 1     20 2     30 欲しいのは以下の結果です。 1 花子 2 太郎 以下のSQLを実行すると、 SELECT distinct a.社員番号, a.社員氏名, b.所属番号 FROM 社員 a,所属 b where a.社員番号 = b.社員番号 order by 所属番号 1 花子 1 花子 2 太郎 となってしまいます。 先に述べたとおりの結果を取得するにはどういうSQLを書いたらいいでしょうか? お知恵を貸してください。宜しくお願いします。 Oracle8iを使用しています。   

  • ORDER BY句を使用しているSQL文に関して質問です。

    ORDER BY句を使用しているSQL文に関して質問です。 SELECT文にてORDER BY句を使用した場合、SELECT結果の件数によってソート順が変わるような事はあるのでしょうか? 事象としては以下の通りです。 以下のCUSTOMERテーブルがあるとします。 |店番|顧客番号|一連番号|一連番号枝番| |MISE|KOKYAKU |ITIREN |IEIRENEDANO | |0001|11111111|00000001|000000000000| |0001|11111111|00000002|000000000000| |0001|11111111|00000003|000000000000| |0001|11111111|00000004|000000000000| |0001|11111111|00000005|000000000000| |0001|11111111|00000005|000000000001| |0001|22222222|00000001|000000000000| |0001|22222222|00000002|000000000000| |0001|22222222|00000003|000000000000| |0001|22222222|00000004|000000000000| |0001|22222222|00000005|000000000000| |0001|22222222|00000006|000000000000| |0001|22222222|00000007|000000000000| |0001|22222222|00000008|000000000000| |0001|22222222|00000009|000000000000| |0001|22222222|00000010|000000000000| |0001|22222222|00000011|000000000000| |0001|22222222|00000012|000000000000| |0001|22222222|00000013|000000000000| |0001|22222222|00000014|000000000000| |0001|22222222|00000014|000000000001| 埋め込みSQLを実行し、上記のテーブルに対し以下の条件でカーソルをオープンしました。 (1)SELECT ITIREN FROM CUSTOMER WHERE MISE = 0001 AND KOKYAKU = 11111111 ORDER BY ITIREN DESC (2)SELECT ITIREN FROM CUSTOMER WHERE MISE = 0001 AND KOKYAKU = 22222222 ORDER BY ITIREN DESC カーソルの1件目をFETCHしたところ、以下のような結果となりました。 (1) |店番|顧客番号|一連番号|一連番号枝番| |MISE|KOKYAKU |ITIREN |IEIRENEDANO | |0001|11111111|00000005|000000000001| (2) |店番|顧客番号|一連番号|一連番号枝番| |MISE|KOKYAKU |ITIREN |IEIRENEDANO | |0001|22222222|00000014|000000000000| 一連番号枝番をORDER BY句のソート条件に追加するか、WHERE句の条件についかすれば事象は解決するのですが、同様のSQLを実行しているのに結果が変わってしまうのがどうしても解せません。 もしご存知の方がいらっしゃいましたら、ご教授頂けると助かります。 テーブルの内容をごちゃごちゃと書いてしまったので、見づらくてすみません。。。 レイアウトがずれてたら更にすみませんm(_ _)m HTMLのタグって使えるんでしょうかね?

  • SQLの集計で「全て」の合計も表示したい

    SQLの集計について教えて下さい。DBはSQLiteかMySQLです(下記テストはSQLiteにて) 「meibo」テーブルから結果(1)を表示するにSQL文(1)で実現できました。 ●meiboテーブル name    type  univ ---------------------------------- 鈴木一郎  国立  東大 高橋ニ郎  国立  東大 田中三郎  国立  京大 山本四郎  公立  大阪府立大 佐藤五郎  私立  慶応大 小川六郎  私立  早稲田大 ●結果(1) type別の人数 type   合計 ------------------- 公立   1 国立   3 私立   2 ●SQL文(1) SELECT type, count(name) FROM meibo GROUP BY type ORDER BY type ; ここに「全ての合計」行を加えて結果(2)を表示したい場合、1つのSQL文で可能でしょうか? それともSQL文(2)のように2つの文で行なうか、SQL文(1)の結果をプログラム側で処理して全ての合計を得るなどするしかないでしょうか?(typeの「全て」は無くても構わない) もし1つのSQL文で可能ならどういう風になるのでしょうか? ●結果(2) type   合計 ------------------- 全て   6     ←この行を追加したい 公立   1 国立   3 私立   2 ●SQL文(2) SELECT type, count(name) FROM meibo ; SELECT type, count(name) FROM meibo GROUP BY type ORDER BY type ;

  • select文の表示結果を置き換える

    sql初心者です、皆様ご教授お願いいたします。 以下のようなselect文の結果が・・・ select aaa,bbb,ccc from XXX order by aaa 以下のようになった場合・・・ 埼玉 100 AAA 東京 200 BBB 東京 200 CCC 東京 300 CCC 千葉 400 CCC 以下のような表示を行う事はsqlで可能でしょうか? 埼玉 100 AAA 東京 200 BBB (〃)(〃) CCC (〃) 300 (〃) 千葉 400 (〃) つまり「一つ前のレコードと同じ結果だった項目は”〃”等の任意の文字列を出力する」です。 宜しくお願いいたします。