这是我的查询:
$sql = "SELECT sum(CommitmentItemInvoices.Amount) AS PendTotal, CommitmentItemInvoices.Amount AS Amount_Pending , CommitmentItems.*, CommitmentItemInvoices.*
FROM CommitmentItemInvoices
LEFT JOIN CommitmentItems on CommitmentItems.commitmentItemId = CommitmentItemInvoices.commitmentItemId
WHERE (CommitmentItemInvoices.Status='new' AND CommitmentItemInvoices.commitmentItemId = :commitId)";
try{
//prepare statement
$stmt = $con->prepare ($sql);
//bind values to :username
$stmt->bindValue("commitId", $commitId, PDO::PARAM_STR);
$stmt->execute();
}catch(PDOException $e){
echo "Error: ".$e->getMessage();
}
我收到以下错误:
错误: SQLSTATE[42000]: 语法错误或访问冲突: 8120 [Microsoft][ODBC SQL Server 驱动程序][SQL Server]列"CommitmentItemInvoices.Amount"在选择列表中无效,因为它未包含在聚合函数或 GROUP BY 子句中。(SQLExecute[8120] at ext''pdo_odbc''odbc_stmt.c:254)
知道我在SQL查询中做错了什么吗?
您需要一个 GROUP BY
语句来允许聚合工作:
SELECT sum(cii.Amount) AS PendTotal
FROM CommitmentItemInvoices cii
LEFT JOIN CommitmentItems ci on
ci.commitmentItemId = cii.commitmentItemId
WHERE (cii.Status='new'
AND cii.commitmentItemId = :commitId)
@xQbert提出了一个很好的建议。 拉出所有字段,您将看到查询有效。 然后将它们逐个添加到查询的选择和分组中。 你将看到聚合的工作原理。
查询中的*
不起作用,因为 sql 引擎需要知道如何聚合总和。 您可以按多个字段进行聚合,但每个字段都需要在分组依据的选择 AND 中指定。
当您添加更多字段作为分组依据时,您可能会得到不同的结果。
阅读 GROUP BY 以确定要分组的字段以获得正确的聚合。