SELECT SUM(column_name) [AS alias_name]
FROM table_name
[WHERE condition]
[GROUP BY group_column];
假設有一張消費記錄表 buylist,欄位包含 mid (會員 ID)、prise (消費金額)。需求:查詢會員 ID 為 1 的總消費額。
$sql = "SELECT SUM(prise) sum from buylist where mid = '1'";
$ress = mysql_query($sql);
echo $rowxiaofei = mysql_fetch_assoc($ress); // 直接 echo 陣列會報錯/只輸出 Array
問題解析:
mysql_* 函數已在 PHP 7.0 移除,請改用 mysqli 或 PDO。mysql_fetch_assoc() 返回關聯陣列,需透過鍵名取值,不可直接 echo。sum 為保留字,建議加反引號或改名。<?php
// 推薦:PDO + 預處理語句
$dsn = 'mysql:host=localhost;dbname=shop;charset=utf8mb4';
$pdo = new PDO($dsn, 'user', 'pass', [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
]);
$mid = 1;
$stmt = $pdo->prepare("SELECT SUM(`prise`) AS `total_amount` FROM `buylist` WHERE `mid` = ?");
$stmt->execute([$mid]);
$result = $stmt->fetch();
if ($result) {
// SUM() 無匹配行時返回 NULL,建議用 COALESCE 處理
$total = $result['total_amount'] ?? 0;
echo "會員 {$mid} 總消費:¥{$total}";
} else {
echo "查無資料";
}
?>
-- 每位會員的總消費、筆數、平均單價
SELECT
`mid`,
COUNT(*) AS `order_count`,
SUM(`prise`) AS `total_amount`,
AVG(`prise`) AS `avg_amount`
FROM `buylist`
GROUP BY `mid`
HAVING `total_amount` > 1000 -- 篩選高價值用戶
ORDER BY `total_amount` DESC;
-- 統計不同支付狀態的金額
SELECT
SUM(CASE WHEN `status` = 'paid' THEN `prise` ELSE 0 END) AS `paid_total`,
SUM(CASE WHEN `status` = 'refunded' THEN `prise` ELSE 0 END) AS `refund_total`
FROM `orders`;
SUM() 會自動忽略 NULL 值,但若結果集為空(無匹配行或全為 NULL),返回 NULL 而非 0。應用層或 SQL 層面務必用 COALESCE(SUM(col), 0) 或 IFNULL() 兜底。
金額欄位**嚴禁使用 FLOAT/DOUBLE**,必須用 DECIMAL(10,2) 或整數存分(如存 100 代表 1.00 元),避免浮點運算誤差導致對帳不平。
WHERE 縮小範圍、分區表、或引入 OLAP 引擎。