【问题标题】:How to debug "Each GROUP BY expression must contain at least one column that is not an outer reference error"如何调试“每个 GROUP BY 表达式必须包含至少一列不是外部引用错误”
【发布时间】:2015-11-07 00:19:55
【问题描述】:

由于 SSRS 不允许对聚合进行过滤,因此我找到了一些代码来帮助我提出以下查询。但是,当我运行它时,我得到:

每个 GROUP BY 表达式必须包含至少一列不是外部引用

我到处搜索,但找不到解决方法。我什至从查询中删除了两个额外的表,所以根本没有连接。如果订单上的总行数小于 500 美元且大于 0,我不需要退回任何订单。

SELECT 
  tdsls041_sales_order_lines.company, 
  tdsls041_sales_order_lines.order_number,  
  tdsls041_sales_order_lines.amount, 
  tdsls041_sales_order_lines.item, 
  tdsls041_sales_order_lines.container
FROM
  tdsls041_sales_order_lines AS tdsls041_sales_order_lines 
WHERE
 (tdsls041_sales_order_lines.company = 610)  AND 
 (tdsls041_sales_order_lines.order_number IN
 (SELECT
    tdsls041_sales_order_lines.order_number
  FROM            
    tdsls041_sales_order_lines AS tdsls041_sales_order_lines_1
  GROUP BY 
    tdsls041_sales_order_lines.order_number
  HAVING  
    (SUM(tdsls041_sales_order_lines.amount) <= 500) OR
     SUM(tdsls041_sales_order_lines.amount) > 0))

【问题讨论】:

    标签: reference group-by outer-join


    【解决方案1】:

    SQL Server 抱怨的问题是 Grouping 需要在 SELECT 语句中使用聚合函数。不幸的是,您想使用 IN,您需要一个 订单号 列表。

    您只需向子查询添加一个聚合函数,然后添加另一个层以从中仅选择订单号。

    SELECT T1.company, T1.order_number,  T1.amount, T1.item, T1.container
    FROM    tdsls041_sales_order_lines AS T1  
    WHERE   (T1.company = 610) AND (T1.order_number IN
                        (SELECT order_number FROM 
                                 (SELECT        TSOL.order_number, SUM(TSOL.amount) AS TTL
                                   FROM            tdsls041_sales_order_lines AS TSOL
                                   GROUP BY TSOL.order_number
                                   HAVING (SUM(TSOL.amount) <= 500) OR
                                                       SUM(TSOL.amount) > 0) AS T2) )
    

    您可以过滤图表和表格中的聚合。您必须将聚合过滤器放在您的 GROUP 而不是表本身上(Group Properties->Filters 选项卡)。

    【讨论】:

    • 感谢您的回答,但是当我尝试这样做时,它也给了我一个错误。它说每个 group by 表达式必须至少包含一个仍然不是外部引用的列,但是它还说当子查询没有引入时,选择列表中只能指定一个表达式存在。
    • 我将 IN 更改为 EXISTS,但仍然出现外部引用错误。
    • 我错过了子查询在运行时发生更改的事实,因此我修复了该部分并且查询现在运行时没有错误。但是,它并没有过滤掉我需要的东西。我收到了超过 500 美元的订单。这是我现在的 where 子句。
    • 它确实将我的 Have 声明更改为
    • HAVING (SUM(amount) 0)) AS derivedtbl_1))
    猜你喜欢
    • 2012-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-29
    • 2020-05-10
    • 1970-01-01
    相关资源
    最近更新 更多