如何调试“每个 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 表达式必须包含至少一列不是外部引用错误”的主要内容,如果未能解决你的问题,请参考以下文章