不能在用于GROUP BY列表的group by列表的表达式中使用聚合或子查询

时间:2018-11-21 13:58:52

标签: sql sql-server

当我尝试运行此查询时,我一直在寻求SQL Server错误提示的帮助。

该查询仅用于按2个条件(数量和收入)将产品分为4组。为了获得收益,我需要ndk { abiFilters "armeabi-v7a", "x86" } 函数,这会导致我在SUM中遇到问题(如果我很了解错误的话)。

我该如何解决这个问题?

GROUP BY

1 个答案:

答案 0 :(得分:1)

您已证实我的怀疑。我会回应-没有必要纠正在逻辑上有缺陷的查询。您需要在分类之前进行汇总。您最初的方法是尝试同时做。因此,重新开始。通常,将问题分解成可以完成的部分比较容易-从基本的选择行开始,然后逐步修改代码以构建实现目标的逻辑。这适用于任何语言。

因此,这是我对一个简短的解决方案的看法。由于您未提供架构或数据,因此我使用了AdventureWorks。将来,当您提供架构和数据或使用标准示例数据库时,很有可能会提供帮助并且非常有用。

with cte as (
    select det.ProductID, sum(det.OrderQty * det.UnitPrice) as totalvalue 
    from Sales.SalesOrderDetail As det 
    where exists (
        select * from Sales.SalesOrderHeader as ord 
        where det.SalesOrderID = ord.SalesOrderID
          and ord.OrderDate >= '20130101' and ord.OrderDate < '20140101'
        )
    group by det.ProductID
)
select cte.ProductID, cte.totalvalue,
    case when totalvalue >= 75000 then 'Great Product' 
         else 'meh - needs work' end
    as [Group]
from cte 
order by [Group], cte.ProductID
;

请注意cte中的where子句。将函数用作过滤器时,最好避免将函数应用于列,因为函数将阻止使用任何有用的索引。还要注意,我忽略了您的大部分逻辑。这演示了该技术;您将需要根据实际需要对其进行扩展。