MySQLで、Oracleの分析関数と同じ結果を取得する5
山岸賢治 [著] 2009/03/19 14:00

SourceCode 5.01 KB

 連載「分析関数の衝撃」では、Oracleの分析関数を主に扱いました。「分析関数の衝撃」の外伝となるこの連載では、 MySQLで、Oracleの分析関数と同じ結果を取得するSQLの考え方と、処理のイメージを解説します。今回は、Ratio_to_report関数,median関数,First指定およびLast指定の分析関数,wmsys.wm_concat関数と同じ結果を取得するSQLを扱います。

1 2 3 4 →

はじめに

 本稿では、Oracleの分析関数の中で、Ratio_to_report関数、median関数、First指定およびLast指定の分析関数、wmsys.wm_concat関数と同じ結果を取得するSQLを扱います。

対象読者

  • MySQLやPostgreSQLで、分析関数と同じ結果を取得するSQLを書きたい方
  • OracleやDB2やSQL Serverの、分析関数の理解を深めたい方

必要な環境

 本稿で扱うSQLは、MySQL 5.1.28で動作確認しました。ソースコードはPostgreSQL 8.3とOracle 10.2.0.1.0でも動作を確認しています。その他、次の環境でも応用が可能です。

  • SQL Server
  • DB2

1. 総合計に対する割合を求める

 最初は、総合計に対する割合を求めるSQLについてです。まずは、テーブルのデータと、出力結果を考えます。

IDTable
IDSeqVal
AA1100
AA2100
AA3500
AA4200
AA5200
AA650
BB1200
BB2400
BB3800
BB4900
CC1100
CC2800
CC3700
DD1400
EE150
FF110
FF320
FF540
FF680

 IDごとのValの総合計に対する、その行のValの割合の百分率を、小数点第3位以下を切り捨てた値で求めます。たとえば、IDがFFの行のValの総合計は、10+20+40+80で150ですので、各行のValの総合計に対する割合は、10/150*100で6.66、20/150*100で13.33、40/150*100で26.66、80/150*100で53.33となります。言いかえれば、Oracleの下記の分析関数を使ったSQLと同じ結果を取得します。

分析関数を使ったSQL
select ID,Seq,Val,
trunc(100 * Ratio_to_report(Val) over(partition by ID),2) as ratio
  from IDTable
order by ID,Seq;
出力結果
IDSeqValratio
AA11008.69
AA21008.69
AA350043.47
AA420017.39
AA520017.39
AA6504.34
BB12008.69
BB240017.39
BB380034.78
BB490039.13
CC11006.25
CC280050
CC370043.75
DD1400100
EE150100
FF1106.66
FF32013.33
FF54026.66
FF68053.33

 IDごとのValの総合計さえ求めれば後は計算すればいい、と考えて、答えは下記となります。

相関サブクエリを使うSQL
select ID,Seq,Val,
(select truncate(100*a.Val / sum(b.Val),2)
   from IDTable b
  where b.ID = a.ID) as ratio
from IDTable a
order by ID,Seq;

 SQLのイメージは下記です。

SQLのイメージ
SQLのイメージ

 なお、MySQLで小数点第3位以下を切り捨てる時はtruncate(数値,2)を使い、Oracleで小数点第3位以下を切り捨てる時はtrunc(数値,2)を使い、PostgreSQLで小数点第3位以下を切り捨てる時はtrunc(数値,2)を使います。


1 2 3 4
→
INDEX
MySQLで分析関数を模倣5(応用編)
Page1
はじめに
対象読者
必要な環境
1. 総合計に対する割合を求める
2. メジアン(中央値)を求める
3. 最大値の合計と最小値の合計
4. その行までの文字列を連結
最後に
参考資料
プロフィール
山岸賢治 ヤマギシケンジ

Oracle ACEの1人。
OracleSQLパズルの運営者。
ORACLE MASTER Silver Oracle Database 10g
(研修受講で)ORACLE MASTER Gold Oracle Database 10g
ソフトウェア開発技術者 (情報処理技術者試験)
第二種情報処理技術者 (情報処理技術者試験)
 


記事へのコメント・トラックバック機能は2011年6月に廃止させていただきました。記事に対する反響はTwitterやFacebook、ソーシャルブックマークサービスのコメントなどでぜひお寄せください。

スポンサーサイト