【GeneXus】Sum・Count・Average・Max・Min

Sum、Count、Average、Max、Min、について検証ということで投稿。



参考
Sum、Count、Average 式wiki.genexus.jp


参考
Max 式、Min 式wiki.genexus.jp

想定環境

GeneXus X Ev3 u14
DB:MYSQL
言語:Java

データ

商品マスタにデータがある感じです。

Sum

合計を求める関数。

// 全ての商品価格の合計を取得。
&Num = Sum(product_price)

Count

個数を求める関数。

// 商品マスタに登録されているデータの数を取得。
&Num = Count(product_id)

Average

平均を求める関数。

// 商品価格の平均値を取得。
&Num = Average(product_price)

Max

最大値を求める関数。

// 商品価格の最大値を取得。
&Num = Max(product_price)

Min

最小値を求める関数。

// 商品価格の最小値を取得。
&Num = Min(product_price)

結果

実行されるSQL

GeneXusが発行してMYSQLで実行しているSQLです。

-- SUM
SELECT COALESCE( T1.`GXC1`, 0) AS GXC1 FROM (SELECT SUM(`product_price`) AS GXC1 FROM `m_product` ) T1
-- COUNT
SELECT COALESCE( T1.`GXC2`, 0) AS GXC2 FROM (SELECT COUNT(*) AS GXC2 FROM `m_product` ) T1
-- AVERAGE
SELECT COALESCE( T1.`GXC3`, 0) AS GXC3 FROM (SELECT AVG(`product_price`) AS GXC3 FROM `m_product` ) T1
-- MAX
SELECT COALESCE( T1.`GXC4`, 0) AS GXC4 FROM (SELECT MAX(`product_price`) AS GXC4 FROM `m_product` ) T1
-- MIN
SELECT COALESCE( T1.`GXC5`, 0) AS GXC5 FROM (SELECT MIN(`product_price`) AS GXC5 FROM `m_product` ) T1

※上記のSQL確認方法はJDBCのログを出力するか、MYSQLの場合は以下のiniファイルを変更すればログが出力されます。

今回は「C:\ProgramData\MySQL\MySQL Server 5.6\my.ini」を以下のように変更。

log-output=FILE
general-log=1
general_log_file="[PC名].log"
slow-query-log=1
slow_query_log_file="[PC名]-slow.log"
long_query_time=10

引数の追加(Count、Sum、Average)

Count、Sum、Averageは検索条件と初期値を設定することが可能です。
第1引数:計算対象の項目
第2引数:検索条件
第3引数:初期値

コード

// 「商品区分:食べ物」の商品価格の合計を取得。
&Num = Sum(product_price, product_kbn = ProductKbn.Food, 0)
// 「商品区分:食べ物」の商品データの数を取得。
&Num = Count(product_id, product_kbn = ProductKbn.Food, 0)
// 「商品区分:食べ物」の商品価格の平均値を取得。
&Num = Average(product_price, product_kbn = ProductKbn.Food, 0)

結果

実行されるSQL

-- SUM
SELECT COALESCE( T1.`GXC1`, 0) AS GXC1 FROM (SELECT SUM(`product_price`) AS GXC1 FROM `m_product` WHERE `product_kbn` = 1 ) T1
-- COUNT
SELECT COALESCE( T1.`GXC2`, 0) AS GXC2 FROM (SELECT COUNT(*) AS GXC2 FROM `m_product` WHERE `product_kbn` = 1 ) T1
-- AVERAGE
SELECT COALESCE( T1.`GXC3`, 0) AS GXC3 FROM (SELECT AVG(`product_price`) AS GXC3 FROM `m_product` WHERE `product_kbn` = 1 ) T1

引数の追加(Max、Min)

Max、Minは検索条件と初期値、さらにどの項目を取得するかを指定することが可能です。
第1引数:計算対象の項目
第2引数:検索条件
第3引数:初期値
第4引数:取得項目

コード

// 「商品区分:食べ物」で商品価格が最大値の商品名称を取得。
&Var = Max(product_price, product_kbn = ProductKbn.Food, "", product_name)
// 「商品区分:食べ物」で商品価格が最小値の商品名称を取得。
&Var = Min(product_price, product_kbn = ProductKbn.Food, "", product_name)

結果

実行されるSQL

-- MAX
SELECT COALESCE( T1.`GXC4`, '') AS GXC4 FROM	(SELECT MIN(T2.`product_name`) AS GXC4 FROM `m_product` T2,	(SELECT MAX(`product_price`) AS GXC6 FROM `m_product` WHERE `product_kbn` = 1 ) T3
WHERE (T2.`product_price` = T3.`GXC6`) AND (T2.`product_kbn` = 1) ) T1
-- MIN
SELECT COALESCE( T1.`GXC5`, '') AS GXC5 FROM	(SELECT MIN(T2.`product_name`) AS GXC5 FROM `m_product` T2,	(SELECT MIN(`product_price`) AS GXC7 FROM `m_product` WHERE `product_kbn` = 1 ) T3
WHERE (T2.`product_price` = T3.`GXC7`) AND (T2.`product_kbn` = 1) ) T1

↑ややこしいSQLだな


とりあえず簡単なところから投稿してみました。
検索条件とか追加できて便利ですね( ^ω^ )ニコニコ

ただ今回紹介したSum・Count・Average・Max・Minですが
For eachの途中とかでやるとワケワカラン結果を返すときがあるので
実装する場合はナビゲーションを見て、自分の思っている通り動いているか確認しながら実装しましょう!

以上です。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください