如何在单条SELECT语句中按不同州多次汇总发票金额?
可行方案:不用循环或多SELECT,轻松按州汇总发票金额
当然有更高效的解决办法,完全不需要写几十条SELECT语句或者循环执行查询!你的需求可以通过条件聚合或者动态分组查询来实现,下面分两种场景详细说明:
场景1:已知需要汇总的州(固定列表)
如果提前知道要统计哪些州(比如NY、VA、WA),可以用CASE WHEN结合SUM()做条件聚合,把每个州的汇总结果作为单独的列返回,语法合法且高效:
SELECT SUM(CASE WHEN state = 'NY' THEN invoice ELSE 0 END) AS ny_total, SUM(CASE WHEN state = 'VA' THEN invoice ELSE 0 END) AS va_total, SUM(CASE WHEN state = 'WA' THEN invoice ELSE 0 END) AS wa_total FROM your_invoice_table; -- 替换成你的实际表名
对应的PHP代码可以这样处理:
$sql = "SELECT SUM(CASE WHEN state = 'NY' THEN invoice ELSE 0 END) AS ny_total, SUM(CASE WHEN state = 'VA' THEN invoice ELSE 0 END) AS va_total, SUM(CASE WHEN state = 'WA' THEN invoice ELSE 0 END) AS wa_total FROM your_invoice_table"; $stmt = $conn->prepare($sql); $stmt->execute(); $stmt->bind_result($ny, $va, $wa); $stmt->fetch(); echo $ny; // 输出123 echo $va; // 输出241
这种方式只需要执行一次查询,就能拿到所有目标州的汇总结果,比多次查询高效得多。
场景2:州的数量/列表动态变化
如果不确定要统计哪些州(比如州会新增,或者需要统计所有存在的州),更灵活的方式是按state分组查询,然后在PHP中把结果整理成关联数组:
SQL语句
SELECT state, SUM(invoice) AS total_invoice FROM your_invoice_table GROUP BY state;
PHP处理代码
$sql = "SELECT state, SUM(invoice) AS total_invoice FROM your_invoice_table GROUP BY state"; $stmt = $conn->prepare($sql); $stmt->execute(); $result = $stmt->get_result(); // 把结果转成「州名 => 总金额」的关联数组 $stateTotals = []; while ($row = $result->fetch_assoc()) { $stateTotals[$row['state']] = $row['total_invoice']; } // 按需输出,比如NY的金额 echo $stateTotals['NY'] ?? 0; // 输出123 echo $stateTotals['VA'] ?? 0; // 输出241
这种方式不需要提前知道所有州的列表,不管新增多少州,SQL都不用修改,完全适配动态场景。
补充说明
你原来写的SQL存在语法错误:WHERE不能重复使用,且AS的位置也不对,所以无法运行。上面的两种方案都是标准SQL语法,几乎所有主流数据库(MySQL、PostgreSQL、SQL Server等)都支持。
内容的提问来源于stack exchange,提问作者Dimitri Bostrovich
相关产品推荐
相关产品推荐

