如何调试“每个 GROUP BY 表达式必须包含至少一列不是外部引用错误”

Posted

技术标签:

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

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

每个 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))

【问题讨论】:

【参考方案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))

以上是关于如何调试“每个 GROUP BY 表达式必须包含至少一列不是外部引用错误”的主要内容,如果未能解决你的问题,请参考以下文章

如何在PyCharm中调试程序

如何使用VC进行远程调试

如何使用真机调试android程序

如何在 iPhone Safari 上调试网页

如何使用ADB进行调试

如何使用真机调试android程序