You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在单条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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 12:32:36