■フィールド値に対する演算
参照したレコードの特定のフィールド名に着目して、そのフィールド名の値が数値の場合、最大値、最小値、平均値などの演算を行うことができます。このような演算を行う関数を集約関数あるいは集合関数と呼びます。
たとえば、フィールド値の平均値を計算する場合は、AVG()関数を使います。この集約関数の結果を参照する場合は、pg_fetch_array()関数で、結果ソースを配列に格納し、最初の要素$arr[0]を参照します。
SQL文 = "SELECT AVG(フィールド名) FROM テーブル名";
結果リソース = pg_query(接続ID,SQL文);
配列 = pg_fetch_array(結果リソース);
集約関数の結果 = 配列[0];
■一時変数
集約関数の結果はRDB内の一時変数に格納することができます。一時変数はフィールド名と同様に参照することができます。
SQL文= "SELECT AVG(フィールド名) AS 一時変数名"
. " FROM テーブル名";
結果リソース = pg_query(SQL文、接続ID);
連想配列 = pg_fetch_assoc(結果リソース);
集約関数の結果 = 連想配列['一時変数名'];
■複数の集約関数の同時利用
集約関数は複数同時に使うことも可能です。集約関数名の間は「,」(カンマ)で区切ります。
SQL文= "SELECT 集約関数名1(フィールド名) AS 一時変数名1,"
. " 集約関数名2(フィールド名) AS 一時変数名2,"
. " 集約関数名3(フィールド名) AS 一時変数名3"
. " FROM テーブル名";
結果リソース = pg_query(SQL文、接続ID);
連想配列 = pg_fetch_assoc(結果リソース);
集約関数の結果 = 連想配列['一時変数名'];
以上のサンプルファイル「avg.php」を以下に示します。
「avg.php」
<?php
// インクルードファイルの読み込み
include "common_pgsql.php";
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;
charset=UTF-8">
<title>avg.php for PostgreSQL8.2</title>
</head>
<body>
<?php
// データベースに接続
$db = db_connect($dbname);
// 処理対象テーブル
$tbl_name = "tbl_商品表2";
show_records($db,$tbl_name);
print "<br>\n"; // 集約関数
// 平均値の計算(AVG()関数)
$field_name = '単価';
$str_sql1 = "SELECT AVG({$field_name})
FROM {$tbl_name} ;";
$rs1 = pg_query($db,$str_sql1);
print "SQL1 = \"{$str_sql1}\";<br>\n";
// 計算結果の参照
$arr = pg_fetch_array($rs1);
$flt_average = $arr[0];
// 計算結果の表示
print "{$field_name}の平均値:<br>\n";
print "AVG({$field_name}) = {$flt_average}<br><br>\n";
// 一時変数「average」の使用
$str_sql2 = "SELECT AVG({$field_name})
AS average
FROM {$tbl_name} ;";
$rs2 = pg_query($db,$str_sql2);
print "SQL2 = \"{$str_sql2}\";<br>\n";
// 計算結果の参照
$arr = pg_fetch_assoc($rs2);
$flt_average = $arr['average'];
// 計算結果の表示
print "{$fld_name}の平均値:<br>\n";
print "average = {$flt_average}<br><br>\n"; //
レコード数と最大値、最小値の計算
$str_sql3 = "SELECT COUNT({$field_name})
AS レコード数,
MIN({$field_name}) AS min_単価,
MAX({$field_name}) AS max_単価
FROM {$tbl_name} ;";
$rs3 = pg_query($db,$str_sql3);
print "SQL3 = \"{$str_sql3}\";<br>\n";
// 計算結果の参照
$arr = pg_fetch_assoc($rs3);
$num_records = $arr['レコード数'];
$min_price = $arr['min_単価'];
$max_price = $arr['max_単価'];
print "<table border=1 cellpadding=0 cellspacing=0>\n";
print "<tr>\n";
print "<td>レコード数</td>";
print "<td align=right>{$num_records}</td>\n";
print "</tr>\n";
print "<tr>\n";
print "<td>min_単価</td>";
print "<td align=right>{$min_price}</td>\n";
print "</tr>\n";
print "<tr>\n";
print "<td>max_単価</td>";
print "<td align=right>{$max_price}</td>\n";
print "</tr>\n";
print "</table>\n";
// 結果リソースの開放
pg_free_result($rs1);
pg_free_result($rs2);
pg_free_result($rs3);
// データベースの切断
pg_close($db);
?>
</body>
</html>
サンプルファイルへのアクセス例を下記に示します。

■GROUP BY句
あるフィールド名に着目し、そのフィールド値が同じレコードを部分集合としてグループ化することができます。たとえば、アンケート結果で「賛成」と答えた人のグループと「反対」と答えた人」のグループに分けるような場合です。一般には、その部分集合ごとにある演算を行います。グループ化する場合は、「GROUP BY」句を使います。たとえば、次のような構文とします。
SELECT フィールド名, 集約関数, FROM テーブル名
GROUP BY フィールド名
次の例では、フィールド名「品目」に着目し、同じ「品目」の値のレコードをグループ化し、各グループのレコード数を計数しています。
$str_sql = "SELECT 品目,COUNT(*) FROM tbl_商品
GROUP BY 品目;";
$rs = pg_query($db,$str_sql);
次の例は、グループごとの単価の合計値を計算しています。
$str_sql = "SELECT 品目,SUM(単価) FROM tbl_商品 GROUP
BY 品目;";
$rs = pg_query($db,$str_sql);
■HAVING句
また、グループごとの演算結果についてある条件にあったグループのみを参照(抽出)することができます。この場合はWHERE句でなくHAVING句を使います。
SELECT フィールド名, 集約関数, FROM テーブル名 GROUP BY フィールド名
HAVING グループに対する条件式
次の例では、単価の合計値が800より大きいグループのみ参照しています。
$str_sql = "SELECT 品目,SUM(単価) FROM tbl_商品 GROUP
BY 品目"
. "HAVING SUM(単価) > 800;";
$rs = pg_query($db,$str_sql);
サンプルファイル「group.php」を以下に示します。
「group.php」
<?php
// インクルードファイルの読み込み
include "common_pgsql.php";
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;
charset=UTF-8">
<title>group.php for PostgreSQL8.2</title>
</head>
<body>
<?php
// データベースに接続
$db = db_connect($dbname);
// 処理対象テーブル
$tbl_name = "tbl_商品";
print "「{$tbl_name}」<br>";
show_records($db,$tbl_name);
print "<br>\n";
// グループ化1
$str_sql1 = "SELECT 品目,COUNT(*) FROM tbl_商品
GROUP BY 品目;";
$rs1 = pg_query($db,$str_sql1);
print "SQL = \"{$str_sql1}\";<br>\n";
show_rs($rs1);
print "<br>\n";
// グループ化2
$str_sql2 = "SELECT 品目,SUM(単価) FROM tbl_商品
GROUP BY 品目;";
$rs2 = pg_query($db,$str_sql2);
print "SQL = \"{$str_sql2}\";<br>\n";
show_rs($rs2);
print "<br>\n";
// HAVING句
$str_sql3 = "SELECT 品目,SUM(単価) FROM tbl_商品
GROUP BY 品目
HAVING SUM(単価) > 800;";
$rs3 = pg_query($db,$str_sql3);
print "SQL = \"{$str_sql3}\";<br>\n";
show_rs($rs3);
print "<br>\n";
// 結果リソースの開放
pg_free_result($rs1);
pg_free_result($rs2);
pg_free_result($rs3);
// データベースの切断
pg_close($db);
?>
</body>
</html>
サンプルファイルへのアクセス例を下記に示します。

|