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

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

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

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Q&A

解決済

2回答

5991閲覧

order byでcountしたデータの大きい順に並び替えたいがNULLの値が上に来てしまう

dsk

総合スコア44

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

0グッド

1クリップ

投稿2015/06/24 00:44

編集2016/03/23 05:45

PostgreSQLの質問です。

やりたいこと

order byを使い、データの数値が大きい順に並び替えたいです。
NULLの値が含まれている時、NULLを0として、並び順の下の方に持って行きたいです。

やったこと 1

下記のようなSQL文を書きました。

lang

1select 2 tblA.clmnA1, 3 tblA.clmnA2, 4 case when tblB.cntclmnB1 is null then 0 else tblB.cntclmnB1 end, 5 case when tblC.cntclmnC1 is null then 0 else tblC.cntclmnC1 end 6 7from ( 8 select clmnA1, clmnA2 9 from tblA 10 where clmnA3 = X 11)tblA 12 13left join( 14 select clmnB1, count(clmnB1) as cntclmnB1 15 from tblB 16 group by clmnB1 17)tblB on tblA.clmnA1 = tblB.clmnB1 18 19left join( 20 select clmnC1, count(clmnC1) as cntclmnC1 21 from tblC 22 group by clmnC1 23)tblC on tblA.clmnA1 = tblC.clmnC1 24 25order by tblB.cntclmnB1 desc, tblC.cntclmnC1 desc

結果 1

case when を使ってNULLの値を0に変えても、下記のように、0が並び順の先に来てしまい、求める結果が得られません。

| tblA.clmnA1 | tblA.clmnA2 | tblB.cntclmnB1 | tblC.cntclmnC1 |
| data | data | 0 | 0 |
| data | data | 9 | 0 |
| data | data | 9 | 8 |
| data | data | 9 | 6 |
| data | data | 7 | 0 |
| data | data | 7 | 4 |

やったこと 2

ググって調べた結果 order by の後に(xxx is null), という記述を入れるという話が出てきたので試してみました。

lang

1select 2 tblA.clmnA1, 3 tblA.clmnA2, 4 case when tblB.cntclmnB1 is null then 0 else tblB.cntclmnB1 end, 5 case when tblC.cntclmnC1 is null then 0 else tblC.cntclmnC1 end 6 7from ( 8 select clmnA1, clmnA2 9 from tblA 10 where clmnA3 = X 11)tblA 12 13left join( 14 select clmnB1, count(clmnB1) as cntclmnB1 15 from tblB 16 group by clmnB1 17)tblB on tblA.clmnA1 = tblB.clmnB1 18 19left join( 20 select clmnC1, count(clmnC1) as cntclmnC1 21 from tblC 22 group by clmnC1 23)tblC on tblA.clmnA1 = tblC.clmnC1 24 25order by 26 (tblB.cntclmnB1 is null), 27 (tblC.cntclmnC1 is null), 28 tblB.cntclmnB1 desc, 29 tblC.cntclmnC1 desc

結果2

そもそもの順番がむちゃくちゃになってしまい、求める結果が得られませんでした。

求めている結果は

このように、0が後に来るデータです。

| tblA.clmnA1 | tblA.clmnA2 | tblB.cntclmnB1 | tblC.cntclmnC1 |
| data | data | 9 | 8 |
| data | data | 9 | 6 |
| data | data | 9 | 0 |
| data | data | 7 | 4 |
| data | data | 7 | 0 |
| data | data | 0 | 0 |

記述の仕方に問題があるのでしょうか。
そもそも、case whenを使って0にすれば0として扱えるというのが勘違いでしょうか。

教えていただけると助かります。

よろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

ordebyのNULLSオプションでnullの表示位置が指定できます。
7.5. 行の並び替え

投稿2015/06/24 00:49

sho_cs

総合スコア3541

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

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

dsk

2015/06/24 06:00 編集

ご回答ありがとうございます。 教えていただいたNULLS LASTという指定をすることで、求める結果になりました。 ありがとうございました。
guest

0

order by COALESCE(tblB.cntclmnB1, 0) desc, COALESCE(tblC.cntclmnC1, 0) desc
でできませんか?

投稿2015/06/24 00:51

編集2015/06/24 00:53
kutsulog

総合スコア985

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

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

dsk

2015/06/24 01:10

ご回答いただき、ありがとうございます。 なるほど、並び替えをするときにNULLを0にして始めてちゃんと整列されるんですね。 いろいろな書き方があって勉強になります。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問