2016-11-14 77 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

感謝您的幫助 - 我將採取窗口功能路線 –

相關問題