gpt4 book ai didi

sql - 为什么必须对 CASE 语句中的列进行 GROUP BY?

转载 作者:行者123 更新时间:2023-12-01 07:09:01 26 4
gpt4 key购买 nike

我正在尝试在 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

我必须处理 Qty 为负但 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 子句中。

列 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)。

最佳答案

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

它给出错误的原因是,您在 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

现在这将返回一个新列 (ClientCost),该列未使用任何聚合。
因此,它要求您在 GROUP BY 表达式中使用它。

关于sql - 为什么必须对 CASE 语句中的列进行 GROUP BY?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1040982/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com