2016-06-13 14 views
1

私はSSRSではなく、クエリではなく別個の値に基づいてデータを集計しようとしています。 SSRSデータセット内のストアドプロシージャを実行してデータを取得しています。以下はprocの結果です:個別の値を取得してグループ化する方法は?

Company ProductID PayeeID PayeeName GroupID Profit 
ABC  123  1  Brenda  1a  $30 
ABC  123  1  Brenda  1a  $30 
ABC  123  1  Brenda  1b  $30 
ABC  456  2  Diana  2a  $45 
ABC  456  2  Diana  2a  $45 
ABC  789  3  Jonathan 3a  $23 
ABC  789  3  Jonathan 3a  $23 
ABC  789  3  Jonathan 3b  $23 
ABC  789  3  Jonathan 3b  $23 

私がする必要があるのは、一意の会社、製品、受取人およびグループIDのグループと合計利益です。ご覧のとおり、重複したグループIDがあります。私はそれをはっきりと記録したい。重複したグループID

のSUM値 いけない**
Company ProductID PayeeID PayeeName Profit 
ABC  123  1  Brenda $90  =(1a+1a+1b) 
ABC  456  2  Diana  $90 
ABC  789  3  Jonathan $92 

:私はSSRS内のすべてのグループのセットアップを持っていますが、グループIDはので、私の結果はSSRSに以下のようにアップ見せているため、それが明瞭にする方法がわかりません

は、私が欲しい:

Company ProductID PayeeID PayeeName Profit 
ABC  123  1  Brenda $60  =(1a+1b) 
ABC  456  2  Diana  $45 
ABC  789  3  Jonathan $46 

**が重複する値

SSRSでこれを行う方法上の任意のアイデアではなく、クエリレベルでを合計しませんか?私はテーブルを作成し、procを実行し、作成したテーブルにそのデータを格納しなければならないので、私はクエリレベルで欲しくないのです。将来、格納されているproc構造体が変更された場合は、両方の場所で変更してレポートを機能させる必要があります。どんな助けもありがとう、ありがとう!

答えて

2

あなたは次のことを試すことができます。

SELECT Company, ProductID, PayeeID, PayeeName, SUM(Profit) as Profit 
FROM (SELECT DISTINCT * FROM Table_1) as t 
GROUP BY Company, ProductID, PayeeID, PayeeName; 
0

1)それが許容できるなら、私はこのように同じストアドプロシージャ内でこの新しい列の値を計算します:

SELECT a.*, 
    SUM(CASE WHEN RowNum = 1 THEN Profit END) 
    OVER(PARTITION BY a.Company/*or CompanyID ?*/, ProductID, PayeeID) AS SumOfProfit 
FROM (
    SELECT ..., -- Plus one more column 
     ROW_NUMBER() OVER(PARTITION BY a.Company/*or CompanyID ?*/, ProductID, PayeeID, GroupID ORDER BY @@SPID) AS RowNum 
    FROM ... final query from stored procedure ... 
    .... 
) a 

を基本的に、これは追加します元のデータセットに新しい列(SumOfProfit)(!)

Company ProductID PayeeID PayeeName GroupID Profit SumOfProfit 
ABC  123  1  Brenda  1a  $30 60 
ABC  123  1  Brenda  1a  $30 60 
ABC  123  1  Brenda  1b  $30 60 
ABC  456  2  Diana  2a  $45 ... 
ABC  456  2  Diana  2a  $45 
ABC  789  3  Jonathan 3a  $23 
ABC  789  3  Jonathan 3a  $23 
ABC  789  3  Jonathan 3b  $23 
ABC  789  3  Jonathan 3b  $23 

2)第二の溶液をt O変換(可能な場合)ユーザ定義関数

  • 多段UDF機能にストアドプロシージャ、それは単に1つのラインを持っている場合(または
  • インラインUDF関数(これは、2本の以上のラインを有する場合)。注:時々{インライン|単一ライン}に複数行のストアドプロシージャを変換することが可能である)関数

及びIは、このように、ストアドプロシージャを変更します

ALTER PROCEDURE ... 
AS 
BEGIN 
    SELECT f.... 
    FROM dbo.UserDefinedFunction(...) f 
    -- ORDER BY ... ? 
END 

このレポートのために、私は希望(I溶液1及び2が適用されないとif initial stored procedure don't include insert into another tableは、第二のレポートのために、我々は、このように最初のストアドプロシージャを再利用することができれば、

SELECT s.Company, s.ProductID, s.PayeeID, SUM(Profit) AS SumOfProfit 
FROM (
    SELECT DISTINCT f.Company, f.ProductID, f.PayeeID, f.GroupID, f.Profit 
    FROM dbo.UserDefinedFunction(...) f 
) s 
GROUP BY s.Company, s.ProductID, s.PayeeID 

3)もちろん、次のクエリ/ストアドプロシージャ(データソースとして)使用)この方法を好きではない:

CREATE TABLE #Results (
    Company ..., 
    ProductID INT, 
    PayeeID INT, 
    ... 
) 
INSERT #Results (...) 
EXEC dbo.FirstStoredProcedure (...) 
-- and then 
SELECT s.Company, s.ProductID, s.PayeeID, SUM(Profit) AS SumOfProfit 
FROM (
    SELECT DISTINCT f.Company, f.ProductID, f.PayeeID, f.GroupID, f.Profit 
    FROM #Results f 
) s 
GROUP BY s.Company, s.ProductID, s.PayeeID 
+0

注:これはSSRSのみの解決策ではないことを認識しています。 –

0

私は純粋SSRS溶液でここにいるが、それは非常に醜いと不必要に複雑です。このソリューションは楽しいものでしたので、私はを使用しませんは、このアプローチを大規模なデータセットに対して使用することをお勧めします.T-SQLレベルのソリューションを強くお勧めします。あなたは、私は次のTablixを作成した投稿データセットに基づいて

enter image description here

私は列の可視性ウィンドウを使用して最後の列(詳細欄)に隠されてきました。カスタムコードを使用して

enter image description here

あなたはVBのコードを使用してSSRS機能の機能を拡張することができます。 Reportメニュー/ Report properties...に移動し、Codeタブに切り替え、テキスト領域に次のコードを挿入します。選択されたセルにおいて

Public Function MySum(ByVal groups as Object(), ByVal values as Object()) As Integer 
Dim found_groups As System.Collections.ArrayList=New System.Collections.ArrayList() 
Dim n as Integer 
Dim sum as Integer = 0 
For n = 0 To groups.Length-1 
    If not found_groups.Contains(groups(n)) Then 
     found_groups.Add(groups(n)) 
     sum = sum + values(n) 
    End If 
Next 
Return sum 
End Function 

(Tablixのスクリーンショットを確認してください)私はこの式を使用した:

=Code.MySum(Lookupset(
Fields!ProductID.Value &"-"& 
Fields!PayeeID.Value &"-", 
Fields!ProductID.Value &"-"& 
Fields!PayeeID.Value &"-", 
CStr(Fields!GroupID.Value), 
"DataSet1" 
), 
Lookupset(
Fields!ProductID.Value &"-"& 
Fields!PayeeID.Value &"-", 
Fields!ProductID.Value &"-"& 
Fields!PayeeID.Value &"-", 
CStr(Fields!Profit.Value), 
"DataSet1" 
)) 

注MySum()関数は、引数として二つの配列を取り、整数を返す、の和指定されたグループの値はProfitです。

それはこのような何かプレビュー:

enter image description here

注意:データ構造は、それが動作しません変更された場合、この溶液は、 あなたの質問に提供したデータセットに基づいて構築されましたが。

これが役立つかどうか教えてください。

関連する問題