2016-11-14 62 views
1

编辑 - 我试图解释这个问题,试图解释我的意思是更好SSRS 2008 R2/SQL - 如何过滤组但保留详细数据?

我使用SQL 2008 R2和我工作的零售百货公司,我们需要一个报告显示所有销售订单在每个部门,以及这些部门的部分。

我想要的是按部门和部门对所有销售订单行进行分组,但只删除销售总额低于50英镑的部分。不过,我仍然希望看到订单超过50英镑。

这里是什么,我现在有一个例子:和其中包含的所有行

数据过滤

我想删除附件部分之前,因为它有一个总段价值低于50英镑。所以,我希望它看起来像这样过滤后:

过滤

这里后

数据是我的代码:

SELECT  department.department_name 
      ,section.section_name 
      ,sales_order_detail.sales_order_number 
      ,sales_order_detail.sales_order_line 
      ,LineValue 

FROM 
sales_order_detail INNER JOIN stock_item ON sales_order_detail.stock_item_code = stock_item.stock_item_code 
INNER JOIN style ON stock_item.style_code = style.style_code 
INNER JOIN department ON style.dept_code = department.department_code 
INNER JOIN section ON style.section_code = section.section_code AND style.dept_code = section.department_code AND department.department_code = section.department_code 

能否请您解释一下这是可以做到的所有方式。我尝试过使用GROUP BY和HAVING,但是会过滤掉我所有的销售订单项次。我使用的Visual Studio报表设计表面,除去线组筛选尝试,但随后在该部门组范围的集合计算不考虑科级删除线。

我感谢所有帮助我能得到这个。 雅各

+0

你好,这个箱子不会让我发布的所有我需要的细节 - 我已经回答了我自己的代码问题。由于 –

+0

我使用SQL 2008 R2,请参阅下面我在回答这个问题的进一步的细节 –

回答

0

当您使用2008R2,您可以使用的Windowed Functions魔法来计算总的行属于(以下over条款的partition一部分)的组,然后换你的查询到一个滤波select声明。没有你的数据这显然不是测试,但它应该工作:

select department_name 
     ,section_name 
     ,sales_order_number 
     ,sales_order_line 
     ,LineValue 
     ,GroupTotal 
from(
    select d.department_name 
      ,se.section_name 
      ,sod.sales_order_number 
      ,sod.sales_order_line 
      ,sod.qty_ordered * sod.selling_price AS LineValue 
      ,sum(sod.qty_ordered * sod.selling_price) over (partition by d.department_name 
                     ,se.section_name 
                  ) as GroupTotal 

    from sales_order_detail sod 
     inner join stock_item si 
      on sod.stock_item_code = si.stock_item_code 
     inner join style s 
      on stock_item.style_code = s.style_code 
     inner join department d 
      on s.dept_code = d.department_code 
     inner join section se 
      on s.section_code = se.section_code 
       and s.dept_code = se.department_code 
       and d.department_code = se.department_code 
) a 
where GroupTotal > 50 
+0

非常感谢戴夫。我的实际数据集将返回数十万(如果不是数百万)销售订单行。当那个函数在SELECT列表中运行时,那个窗口函数不是每次都为每一行运行?如果它必须计算相同的组总数100,000次才会影响我们的SQL服务器性能?只是好奇,我曾想过的窗口功能,它丢弃这个原因 –

+0

窗函数是在他们做什么难以置信的高效率,因为他们是不一样的普通的UDF。无论您走的路线,从而来筛选基于您的总,你会被定义必须汇整所有的行*然后*筛选结果。你可以用一组临时表等来做到这一点,但是它需要更多的表格读取,而窗口函数不应该这样做。在性能方面,尽管我无法告诉你它会在你的环境中运行得如何,但在这方面,你需要自己做适当的测试。 – iamdave

+0

感谢您的帮助 - 我将采取窗口功能路线 –

相关问题