MDS*_*ens 3 sql group-by case-statement
我正在尝试在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
Run Code Online (Sandbox Code Playgroud)
我必须处理数量为负数但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
Run Code Online (Sandbox Code Playgroud)
但是,运行此查询时出现以下错误:
列数量在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中.
列MarkedUpTotal在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中.
我希望得到以下结果:
OrderID OrderTotalQty InternalCost ClientCost
1 8 8.00 8.80
Run Code Online (Sandbox Code Playgroud)
我似乎很奇怪,当它们仅被CASE声明有条件地使用时,我必须是GROUP BY Qty和MarkedUpTotal.如果我删除最后一个选择(CASE语句),查询执行正常,并且不要求数量或价格在GROUP BY中.
为什么SQL需要这个?是否有一个查询可以完成上述任务?
目前我正在使用临时表来解决问题.如果需要,我会修改每个条目的MarkedUpTotal,然后在临时表的主查询中执行简单的SUM(MarkedUpTotal).
sha*_*esh 13
SELECT OrderID, SUM(Qty) as OrderTotalQty,
SUM(Qty*Price) as InternalCost,
SUM(CASE WHEN Qty < 0 and MarkedUpTotal > 0
THEN -1*MarkedUpTotal
ELSE MarkedUpTotal) END as ClientCost
FROM OrderItems
GROUP BY OrderID
Run Code Online (Sandbox Code Playgroud)
它给出错误的原因是因为,你在CASE中对它进行求和 - 这将在外面返回1个值.对于带有GROUP BY的SELECT,它看起来像是传入一个数值(可以是常量或来自其他来源)作为列.
想想你的SQL语句,与此类似
SELECT OrderID, SUM(Qty) as OrderTotalQty,
SUM(Qty*Price) as InternalCost,
CASE WHEN Qty < 0 and MarkedUpTotal > 0
THEN 10
ELSE 20 END as ClientCost
FROM OrderItems
GROUP BY OrderID
Run Code Online (Sandbox Code Playgroud)
现在这将返回一个新列(ClientCost),它不使用任何聚合.
因此,它要求您在GROUP BY表达式中使用它.