我试图在 SQL Server 2008 中针对某些数据输入不一致的表运行查询,我必须处理这个问题。
表数据示例:
OrderID Qty Price MarkedUpTotal
1 10 1.00 11.00
1 -1 1.00 -1.10
1 -1 1.00 1.10
我必须处理数量为负但 MarkedUpTotal 输入为正的情况。
我想运行以下查询:
SELECT OrderID, SUM(Qty) as OrderTotalQty,
SUM(Qty*Price) as InternalCost,
CASE WHEN Qty < 0 and MarkedUpTotal > 0
THEN sum(-1*MarkedUpTotal)
ELSE SUM(MarkedUpTotal) END as ClientCost
FROM OrderItems
GROUP BY OrderID
但是,当我运行此查询时出现以下错误:
列 Qty 在选择列表中无效,因为它既不包含在聚合函数中,也不包含在 GROUP BY 子句中。
MarkedUpTotal 列在选择列表中无效,因为它既不包含在聚合函数中,也不包含在 GROUP BY 子句中。
我希望得到以下结果:
OrderID OrderTotalQty InternalCost ClientCost
1 8 8.00 8.80
当 CASE 语句有条件地使用它们时,我必须 GROUP BY Qty 和 MarkedUpTotal 对我来说似乎很奇怪。如果我删除最后一个选择(CASE 语句),则查询执行良好,并且不需要 Qty 或 Price 在 GROUP BY 中。
为什么 SQL 需要这个?是否有一个查询可以完成上述操作?
目前我正在通过使用临时表来解决这个问题。如果需要,我会修改每个条目的 MarkedUpTotal,然后在临时表的主查询中执行简单的 SUM(MarkedUpTotal)。