質問するログイン新規登録
SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

ソート

複数のデータを、順序性に従って並べ替えること。 データ処理を行う際に頻繁に用いられ、多くのアルゴリズムが存在します。速度、容量、複雑さなどに違いがあり、高速性に特化したものにクイックソートがあります。

Q&A

解決済

2回答

791閲覧

SQLiteで複雑なソート

KoReMoYu

総合スコア0

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

ソート

複数のデータを、順序性に従って並べ替えること。 データ処理を行う際に頻繁に用いられ、多くのアルゴリズムが存在します。速度、容量、複雑さなどに違いがあり、高速性に特化したものにクイックソートがあります。

0グッド

0クリップ

投稿2020/05/14 06:14

編集2020/05/15 05:51

0

0

前提・実現したいこと

DELPHIで社内システムを作っています。
システム内部のデータベース部分にSQLiteを利用していますが
データ一覧表示時の並び順を思うようにできずにいます。
DELPHI部分は大丈夫ですが、データベース(SQLite)は全くの初心者で
手探り状態で開発しています。
SQLiteの構文をご教授頂ければ幸いです。

以下のようにソートして表示したいと思っています。
'上司'カラムは表示しませんので、データそのものを書き換えてしまう方法でも
かまいません。

イメージ説明

SQLコード(上図真ん中の状態になります)

CREATE TABLE 社員DATA(ID INTEGER, 名前 TEXT, 社員No TEXT, 上司 TEXT); INSERT INTO 社員DATA(ID, 名前, 社員No ) VALUES(1, 'DDD', '111' ); INSERT INTO 社員DATA(ID, 名前, 社員No ) VALUES(2, 'PPP', '222' ); INSERT INTO 社員DATA(ID, 名前, 社員No, 上司) VALUES(3, 'KKK', '333', '111'); INSERT INTO 社員DATA(ID, 名前, 社員No, 上司) VALUES(4, 'EEE', '444', '555'); INSERT INTO 社員DATA(ID, 名前, 社員No ) VALUES(5, 'VVV', '555' ); INSERT INTO 社員DATA(ID, 名前, 社員No, 上司) VALUES(6, 'QQQ', '666', '111'); INSERT INTO 社員DATA(ID, 名前, 社員No, 上司) VALUES(7, 'NNN', '777', '555'); INSERT INTO 社員DATA(ID, 名前, 社員No, 上司) VALUES(8, 'HHH', '888', '111'); INSERT INTO 社員DATA(ID, 名前, 社員No, 上司) VALUES(9, 'AAA', '999', '111'); SELECT 名前,社員No,上司 FROM 社員DATA ORDER BY 上司,社員No

宜しくお願いいたします。

試したこと

途中経過のソートは
[ SELECT 名前,社員No,上司 FROM 社員DATA ORDER BY 上司,社員No ]
で上図真ん中の順に表示することは出来ます。
調べると、右の状態にするには自己結合(再帰)とか出てきますが、
理解できずに可能なのかもわかりません。

以下文章、いただいたアドバイスにより考えたことの追記

SQL文で可能であればですが、上方図の真ん中の状態から下図のように上司カラムを
編集してから上司カラムでソートできれば、思っていた通りの結果になりそうです。

SQLでの実行の方が速そうですが、この内容の上司カラムの書き換えは開発環境側(DELPHI)
であれば自分にも出来そうな気がしてますので、そちらも併せてテストしてみようと思います。

イメージ説明

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

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

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

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

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

guest

回答2

0

ORDER BYの最初を、上司がNULLだったら社員No にしては?
ifnull 関数

投稿2020/05/14 06:26

Orlofsky

総合スコア16419

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

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

KoReMoYu

2020/05/14 07:54

早速の回答ありがとうございます。 まだすぐに検証はできませんが、後ほど試してみたいと思います。
KoReMoYu

2020/05/14 21:12

アドバイスいただいた方法で、以下のようにしてみました。 [ SELECT 名前,社員No,上司 FROM 社員DATA ORDER BY IFNULL(上司,社員No),社員No ] かなり思った通りの結果になりましたが、単純に'NUL'を'社員No'に変換して ソートしますと、上図の例では右の結果の'EEE'と'VVV'が逆になります。 上司である'NUL'のレコードの下に部下が連なるようにしたいと思うのですが・・・ '上司'カラムは表示しませんので、データそのものを書き換えてしまう方法でも かまわないのですが。 宜しくお願いします。
Orlofsky

2020/05/15 04:17 編集

さて、困りましたね。 わたしなら、社員no 444 と 555 のようなコード体系を入れ替えて上司を再設定することを考えるか、別に順番を調整する列を追加(メンテが面倒だけど)を考えます。 奇特な人がいるかもしれませんから、 実際にSQLを実行して現象を再現しやすいように、質問のテーブル定義とデータを CREATE TABLEとINSERTに変更しては?
KoReMoYu

2020/05/15 05:54

アドバイスありがとうございます。 アドバイスいただいた内容により、質問本文を編集させていただきました。 上司カラムを書き換える方法を考えましたが、SQLで実行できればいいのですが、 開発環境側での実行であれば自分でも出来そうですので、併せてテストしてみようと 思います。
guest

0

自己解決

自己解決いたしました。

質問文の追記部に書きました上司カラムの書き換えをDELPHI側から行い、
上司カラムでのソートにより思い通りの順番にすることができました。

SQL文での対応ができるか興味ありましたが、アプリケーションの動作
としては問題ありませんので解決とさせて頂きます。

アドバイスありがとうございました。
お騒がせしました。

投稿2020/05/16 08:01

KoReMoYu

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問