ラベル SQuirreL SQL の投稿を表示しています。 すべての投稿を表示
ラベル SQuirreL SQL の投稿を表示しています。 すべての投稿を表示

2018/02/20

SQL CASE文 複数記述 三つの内最大の物を取得する 

次のようなテーブル名 Scoreで4行の其々最大のレコードを取得したいとき。 


Score
x y z
1 2 3
1 2 2
3 3 3
5 4 2

単純な比較の場合は、簡単な記述で済む


SELECT CASE WHEN x < y THEN y
            ELSE x END AS maxmum
  FROM Score;





しかしながら、複数で比較が発生する場合は些か記載が面倒になる




SELECT CASE WHEN CASE WHEN x < y THEN y
                      ELSE x END < z THEN z
            ELSE CASE WHEN x < y THEN y
                      ELSE x END END AS maxmum

  FROM Score;

4つでの比較になると、更に2回記述が増えるので、非常に見難い。
三つ巴までが使用限界と思う。


テーブル内に処理番号、日付、店舗ごとの管理連番、を格納している社内DBで、
年度ごとの店舗ごとの処理件数の合計をカウントでなく、管理連番の最大値の合計を
取得したかった。
受付時、受付受理時、一次納品、二次納品、三次納品、納品完了
このようなステージごとに管理しているが、
一次~三次納品は一括りで数値が欲しかったため、
複数のcaseが必要になった。

力技で一行づつ比較となるので、
レコード数が重いと結構負荷がかかるようだ。

2014/01/21

PostgreSQL 配列関数 複数行帰ってくるクエリを一行で表示させる表現 ARRAY関数

複数のテーブルを跨いだクエリで、selectの結果が複数行で返ってくる場合、
pg_fetch_array等で、一覧表として表現したい事がある。

通常、LEFT JOIN等を行っても、複数行がそのまま表示されてしまう。
ただ内容を見る場合は、これでも良いのだが、
pg_num_rows 等で件数を合わせて管理したい場合、カウントがおかしくなってしまう。

いろいろと探したところ、配列関数でクエリを投げれるようなので、実装した際のオボエガキ。

条件

テーブル
tab1
tab2

tab1 のカラム
seqnumber
name
add



tab2 のカラム
tab2seqnumber
number こいつもユニークでこれを軸に番号を発番している。
memo



クエリ生成

select seqnumber,
( select array_to_string(ARRAY(select number||memo from tab2
where tab1.seqnumber=tab2.tab2seqnumber ), ',') ) AS
combine,name,add from tab1 where seqnumber=7777;


このような表現でOK

大枠のクエリの抽出条件の中に、
select array_to_string(ARRAY・・・, ',' )を入れ子にしているのがポイント。

たとえば、
select seqnumber,number||memo,name,add from  tab1 left join tab2 on tab1.seqnumber=tab2.tab2seqnumber where seqnumber=7777;

この場合、3行の検索結果が返ってくるとすると、
seqnumber,101memo1,102memo2,103memo3,name,add
のように
number||memo が若い順にカンマ区切りで文字列として表示される。

何気にすごく使える。

本家の解説ページ
http://www.postgresql.jp/document/8.0/html/functions-array.html