我试图在SQL Server 2008中针对某个数据输入不一致的表中运行查询,并且必须处理此问题。为什么必须GROUP BY CASE语句中的列?
表数据例如:
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
不过,我得到以下错误,当我运行此查询:
列数量是因为它是在选择列表中无效不包含在聚合函数或GROUP BY子句中。
Column MarkedUpTotal在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。
我想要的结果如下:
OrderID OrderTotalQty InternalCost ClientCost
1 8 8.00 8.80
这似乎很奇怪,我认为我必须当他们只被有条件通过CASE语句中使用GROUP BY数量和MarkedUpTotal。如果我删除最后一个选择(CASE语句),则查询执行正常,并且不要求数量或价格在GROUP BY中。
为什么SQL需要这个?有没有可以完成上述的单个查询?
目前我正在通过使用临时表来解决问题。如果需要,我修改每个条目的MarkedUpTotal,然后在临时表的主查询中执行一个简单的SUM(MarkedUpTotal)。
当然。我不敢相信我没有意识到把CASE放在SUM里面。谢谢! – MDStephens 2009-06-24 21:14:36