O C CH COOH - mhlwCOOH C CH 3 試 験 結 果 直 接 試 験 結 果 直 接 不純物*1(物質名,含有率) サリチル酸 0.1%以下 残りは不明 審査部会 第 66
SQLを書こう (実践編 - 合計残高試算表)
-
Upload
nakajimayuji -
Category
Technology
-
view
444 -
download
0
Transcript of SQLを書こう (実践編 - 合計残高試算表)
はじめに
このスライドは、 SQL の構文を覚えた新人に、実際に SQL 文を書くときの考え方を説明するために作成したものです。標準 SQL を想定していますが、一部、 SQL Server に依存している部分があります。
小さい方は出ないようにしよう。select case when 借方合計 > 貸方合計 then ( 借方合計 - 貸方合計 ) else null end as 借方残高 , 勘定科目名 , case when 借方合計 < 貸方合計 then ( 貸方合計 - 借方合計 ) else null end as 貸方残高from 合計試算表
両方繋ぐと?select 借方 . 借方合計 , 借方 . 勘定科目名 , 貸方 . 貸方合計from ( select 勘定科目名 , sum( 金額 ) as 借方合計 from 仕訳帳 where 貸借 = ' 借方 ' group by 勘定科目名 ) as 借方inner join ( select 勘定科目名 , sum( 金額 ) as 貸方合計 from 仕訳帳 where 貸借 = ' 貸方 ' group by 勘定科目名 ) as 貸方 on 貸方 . 勘定科目名 = 借方 . 勘定科目名
left outer だと?select 借方 . 借方合計 , 借方 . 勘定科目名 , 貸方 . 貸方合計from ( select 勘定科目名 , sum( 金額 ) as 借方合計 from 仕訳帳 where 貸借 = ' 借方 ' group by 勘定科目名 ) as 借方left outer join ( select 勘定科目名 , sum( 金額 ) as 貸方合計 from 仕訳帳 where 貸借 = ' 貸方 ' group by 勘定科目名 ) as 貸方 on 貸方 . 勘定科目名 = 借方 . 勘定科目名
full outer だと?select 借方 . 借方合計 , 借方 . 勘定科目名 , 貸方 . 貸方合計from ( select 勘定科目名 , sum( 金額 ) as 借方合計 from 仕訳帳 where 貸借 = ' 借方 ' group by 勘定科目名 ) as 借方full outer join ( select 勘定科目名 , sum( 金額 ) as 貸方合計 from 仕訳帳 where 貸借 = ' 貸方 ' group by 勘定科目名 ) as 貸方 on 貸方 . 勘定科目名 = 借方 . 勘定科目名
最終的に、こんな感じ。select 借方 . 借方合計 , coalesce( 借方 . 勘定科目名 , 貸方 . 勘定科目名 ) as 勘定科目名 , 貸方 . 貸方合計from ( select 勘定科目名 , sum( 金額 ) as 借方合計 from 仕訳帳 where 貸借 = ' 借方 ' group by 勘定科目名 ) as 借方full outer join ( select 勘定科目名 , sum( 金額 ) as 貸方合計 from 仕訳帳 where 貸借 = ' 貸方 ' group by 勘定科目名 ) as 貸方 on 貸方 . 勘定科目名 = 借方 . 勘定科目名
余談:遅い SQL の特徴
遅い(実行時間が長い) SQL になる条件はいろいろありますが、「 from 句に登場するテーブル(実表)の数が多い」場合も遅くなりがちです。
「実表」というのが曲者で、 view の場合はその中に含まれる実表の数になります。
ということで、別解。select sum(case when 貸借 = ' 借方 ' then 金額 else 0 end) as 借方合計 , 勘定科目名 , sum(case when 貸借 = ' 貸方 ' then 金額 else 0 end) as 貸方合計from 仕訳帳group by 勘定科目名
最終的に合計残高試算表はselect case when 借方合計 > 貸方合計 then ( 借方合計 - 貸方合計 ) else null end as 借方残高 , 借方合計 , 勘定科目名 , 貸方合計 , case when 借方合計 < 貸方合計 then ( 貸方合計 - 借方合計 ) else null end as 貸方残高from ( select sum(case when 貸借 = ' 借方 ' then 金額 else 0 end) as 借方合計 , 勘定科目名 , sum(case when 貸借 = ' 貸方 ' then 金額 else 0 end) as 貸方合計 from 仕訳帳 group by 勘定科目名 ) as 合計試算表
まとめ
join のときは、行がなくならないように気をつける。
事前に絞り込んでおかなくても、必要な情報を 1 つの行に並べられれば、 select 句でなんとかなる。
欲しいテーブルがなければ、作る。from 句に登場する実表の数に気をつける。