2015-08-13 63 views
0

由于SSRS不允许在聚合上使用过滤器,因此我发现了一些代码,这些代码帮助我提出了下面的查询。然而,当我运行它,我得到:如何调试“每个GROUP BY表达式必须包含至少一列不是外部引用错误”

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

回答

0

SQL Server正在抱怨的问题是,分组希望聚合函数在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上,而不是放置在表上(组属性 - >过滤器选项卡)。

+0

感谢您的回答,但是当我尝试时,它也给我一个错误。它表示每个按表达式组必须至少包含一个不是外部引用的列,但它还表示只有当子查询未与exists一起引入时,才可以在选择列表中指定一个表达式。 – KSharp

+0

我将IN更改为EXISTS,但仍然收到外部参考错误。 – KSharp

+0

我错过了当我运行子查询时发生更改的事实,所以我修复了该部分,现在查询没有错误地运行。但是,它并没有过滤掉我需要的东西。我得到的订单超过500美元。这是我现在的where子句。 – KSharp

相关问题