2016-11-14 8 views
1

EDIT - 私は何を意味するのかを説明するためにこの質問を再掲載しています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を使用しようとしましたが、その後すべての私の受注明細を除外しました。私はラインを削除するビジュアルスタジオのレポートデザインサーフェスでグループフィルタを使用しようとしましたが、部門グループスコープで計算された集計では、セクションレベルで削除されたラインは考慮されません。

私はこれに得ることができる任意のヘルプをありがとう。 ヤコブ

+0

こんにちは、このボックスは、私が必要としたすべての詳細を投稿させませんでした。ありがとうございました –

+0

私はSQL 2008 R2を使用しています、詳細については、この質問への私の返信で参照してください –

答えて

0

あなたが2008R2を使用しているとして、あなたは行が(以下over句のpartition一部)が属するグループの合計を計算するWindowed Functionsをしている魔法を使用して、フィルタリングにクエリをラップすることができます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

多くのありがとうDave。私の実際のデータセットは、何百(何百万ではないにしろ)の受注明細を返すでしょう。その関数はSELECTリストで実行されるので、各行に対して毎回実行されるウィンドウ関数はありませんか?同じグループを計算する必要がある場合、合計100,000回はSQL Serverのパフォーマンスに影響しません。私は窓関数を考えて、それを捨てました。 –

+0

窓関数は、通常のUDFと同じではないので、非常に効率的です。あなたが取るルートにかかわらず、あなたの合計に基づいてフィルタをかけるには、すべての行*を集計して結果をフィルタリングする必要があります。あなたは一時テーブルのセットなどでこれを行うことができますが、それはウィンドウ関数がどこではいけないのかをより多くのテーブルの読み込みを必要とします。パフォーマンス面では、私はあなたの環境でこれがどれだけうまくいくのかは分かりませんが、その面では適切なテストを自分で行う必要があります。 – iamdave

+0

あなたの助けてくれてありがとう - 私は窓の機能ルートを取るでしょう –

関連する問題