| ページ一覧 | ブログ | twitter |  書式 | 書式(表) |

MyMemoWiki

「SQL CASE」の版間の差分

提供: MyMemoWiki
ナビゲーションに移動 検索に移動
 
1行目: 1行目:
==SQL CASE==
+
==[[SQL CASE]]==
{{category SQL}}
+
[[Category:SQL]]
 
{{amazon|4798115169}}
 
{{amazon|4798115169}}
 
*すばらしい本。自分なりに以下消化しとく。
 
*すばらしい本。自分なりに以下消化しとく。
[[http://otndnld.oracle.co.jp/document/products/oracle10g/102/doc_cd/server.102/B19201-02/toc.html Oracle SQL Reference]] |
+
[http://otndnld.oracle.co.jp/document/products/oracle10g/102/doc_cd/server.102/B19201-02/toc.html Oracle SQL Reference]
  
 
==CASE式==
 
==CASE式==
[[Database]] | {{category SQL}}
+
[[Database]] | [[Category:SQL]]
 
===CASEの書式===
 
===CASEの書式===
 
=====単純CASE=====
 
=====単純CASE=====
20行目: 20行目:
 
*集計のためのキーを持っていない状態で、任意の条件でグループ化して集計する。
 
*集計のためのキーを持っていない状態で、任意の条件でグループ化して集計する。
 
=====元テーブル=====
 
=====元テーブル=====
  SQL> select * from test01;
+
  [[SQL]]> select * from test01;
 
   
 
   
 
  KEY1          VAL1
 
  KEY1          VAL1
30行目: 30行目:
 
  e                5
 
  e                5
 
  f                6
 
  f                6
=====SQL=====
+
=====[[SQL]]=====
 
  select case key1 when 'a' then 'g1'
 
  select case key1 when 'a' then 'g1'
 
                   when 'b' then 'g1'
 
                   when 'b' then 'g1'
47行目: 47行目:
 
  /
 
  /
 
=====結果=====
 
=====結果=====
  GROU SUM(VAL1)
+
  G[[R]]OU SUM(VAL1)
 
  ---- ----------
 
  ---- ----------
 
  g1            3
 
  g1            3
54行目: 54行目:
 
  o1            6
 
  o1            6
  
===異なる条件の集計を1つのSQLで===
+
===異なる条件の集計を1つの[[SQL]]で===
 
*KEY1グループで、KEY2別にVAL1の集計を行い結果を列に表示させる
 
*KEY1グループで、KEY2別にVAL1の集計を行い結果を列に表示させる
 
=====元テーブル=====
 
=====元テーブル=====
  SQL> select * from test02;
+
  [[SQL]]> select * from test02;
 
   
 
   
 
  KEY1  KEY2      VAL1
 
  KEY1  KEY2      VAL1
67行目: 67行目:
 
  c      2            5
 
  c      2            5
 
  c      3            6
 
  c      3            6
=====SQL=====
+
=====[[SQL]]=====
 
  select key1,
 
  select key1,
 
         sum ( case when key2='1' then val1 else 0 end) as cnt_1,
 
         sum ( case when key2='1' then val1 else 0 end) as cnt_1,
84行目: 84行目:
 
===テーブルをマッチングしてマトリックスを作成===
 
===テーブルをマッチングしてマトリックスを作成===
 
=====元データ=====
 
=====元データ=====
  SQL> select * from test03;
+
  [[SQL]]> select * from test03;
 
   
 
   
 
  KEY1
 
  KEY1
92行目: 92行目:
 
  c
 
  c
  
  SQL> select * from test04;
+
  [[SQL]]> select * from test04;
 
   
 
   
 
  KEY1        KEY2
 
  KEY1        KEY2
103行目: 103行目:
 
  c              3
 
  c              3
  
=====SQL=====
+
=====[[SQL]]=====
*[Access SQL マトリックスを作成する] [Accessでの例]
+
*[[Access SQL マトリックスを作成する|Accessでの例]]
 
  select key1,
 
  select key1,
 
         case when key1 in (select key1 from test04 where key2 = 1) then '○' else '-' end as k_1,
 
         case when key1 in (select key1 from test04 where key2 = 1) then '○' else '-' end as k_1,
121行目: 121行目:
 
*KEY1に対して、KEY2の件数を調べて最小値を表示。KEY2が複数ある場合「代表」と表示させる
 
*KEY1に対して、KEY2の件数を調べて最小値を表示。KEY2が複数ある場合「代表」と表示させる
 
=====元テーブル=====
 
=====元テーブル=====
  SQL> select * from test04;
+
  [[SQL]]> select * from test04;
 
   
 
   
 
  KEY1        KEY2
 
  KEY1        KEY2
131行目: 131行目:
 
  b              3
 
  b              3
 
  c              3
 
  c              3
=====SQL=====
+
=====[[SQL]]=====
 
  select key1,
 
  select key1,
 
       case when count(key1) = 1
 
       case when count(key1) = 1

2020年2月16日 (日) 04:32時点における最新版

SQL CASE

  • すばらしい本。自分なりに以下消化しとく。

Oracle SQL Reference

CASE式

Database |

CASEの書式

単純CASE
case key when '1' then 'a'
         when '2' then 'b'
         else          'c' end
検索CASE
case when key = '1' then 'a'
     when key = '2' then 'b'
     else                'c' end

既存のコード体系を新しい体系として集計

  • 集計のためのキーを持っていない状態で、任意の条件でグループ化して集計する。
元テーブル
SQL> select * from test01;

KEY1           VAL1
-------- ----------
a                 1
b                 2
c                 3
d                 4
e                 5
f                 6
SQL
select case key1 when 'a' then 'g1'
                 when 'b' then 'g1'
                 when 'c' then 'g2'
                 when 'd' then 'g2'
                 when 'e' then 'g3'
                 else          'o1' end as group1,
                 sum(val1)
from test01
group by case key1 when 'a' then 'g1'
                   when 'b' then 'g1'
                   when 'c' then 'g2'
                   when 'd' then 'g2'
                   when 'e' then 'g3'
                   else          'o1' end
/
結果
GROU  SUM(VAL1)
---- ----------
g1            3
g3            5
g2            7
o1            6

異なる条件の集計を1つのSQL

  • KEY1グループで、KEY2別にVAL1の集計を行い結果を列に表示させる
元テーブル
SQL> select * from test02;

KEY1   KEY2       VAL1
------ ---- ----------
a      1             1
a      2             2
b      1             3
b      3             4
c      2             5
c      3             6
SQL
select key1,
       sum ( case when key2='1' then val1 else 0 end) as cnt_1,
       sum ( case when key2='2' then val1 else 0 end) as cnt_2,
       sum ( case when key2='3' then val1 else 0 end) as cnt_3
from test02
group by key1
/
結果
KEY1        CNT_1      CNT_2      CNT_3
------ ---------- ---------- ----------
b               3          0          4
c               0          5          6
a               1          2          0

テーブルをマッチングしてマトリックスを作成

元データ
SQL> select * from test03;

KEY1
------
a
b
c
SQL> select * from test04;

KEY1         KEY2
------ ----------
a               1
a               3
b               1
b               2
b               3
c               3
SQL
select key1,
       case when key1 in (select key1 from test04 where key2 = 1) then '○' else '-' end as k_1,
       case when key1 in (select key1 from test04 where key2 = 2) then '○' else '-' end as k_2,
       case when key1 in (select key1 from test04 where key2 = 3) then '○' else '-' end as k_3
from test03
/
結果
KEY1   K_1    K_2    K_3
------ ------ ------ ------
a      ○     -      ○
b      ○     ○     ○
c      -      -      ○

CASE式の中で集約関数を利用する

  • KEY1に対して、KEY2の件数を調べて最小値を表示。KEY2が複数ある場合「代表」と表示させる
元テーブル
SQL> select * from test04;

KEY1         KEY2
------ ----------
a               1
a               3
b               1
b               2
b               3
c               3
SQL
select key1,
      case when count(key1) = 1
            then   to_char(min(key2))
            else   to_char(min(key2)) || '(代表)'
            end as key2
from test04
group by key1
/
結果
KEY1   KEY2
------ ----------
a      1(代表)
b      1(代表)
c      3

任意の順序でソートするためにCASE式を利用する

select key1, val1
from test04
order by case key when 'b' then 1
                  when 'c' then 2
                  when 'a' then 3

条件に従い更新する内容を変更するためにCASE式を利用する

update test04
set key1 =  case key1 
            when 'c' then 'd'
            when 'b' then 'c'
            when 'a' then 'b'
            else          'x' end