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の途中とかでやるとワケワカラン結果を返すときがあるので
実装する場合はナビゲーションを見て、自分の思っている通り動いているか確認しながら実装しましょう!
以上です。