1

私は SSRS レポートを作成していますが、その実装方法を理解するのに少し苦労しています。

まず、データの基本構造は次のとおりです。

  • レベル 1a
    • レベル 2a
    • レベル 2b
    • レベル 2c
      • レベル 3a
  • レベル 1b
  • レベル 1c

データベースでは、各レベルに ID と親 ID があり、ルート (レベル 1 の親) のすべての親 ID は 0 です。さらに、各レベルには数値の列があります。たとえば、次のような場合があります。

Level1a
ParentId = 0
Id = 1
DataValue = 42

Level2a
ParentId = 1
Id = 2
DataValue = 1

現在、階層構造とデータのレベルを取得するために共通のテーブル式を実装しています。

WITH cteTable(id, parentId, data, level) AS 
(SELECT id, 
        parentId, 
        data, 
        1 AS level 
FROM sampleTable 
WHERE (parentId = 0) 
UNION ALL 
SELECT b.id, 
       b.parentId, 
       b.data, 
       c.level + 1 AS Expr1 
FROM sampleTable AS b 
INNER JOIN cteTable AS c ON b.parentId= p.id
) 
SELECT id, 
       parentId,  
       data, 
       level 
FROM cteTable

したがって、前のサンプル データを使用すると、クエリの結果は次のようになります。

+----+----------+------+-------+
| id | parentId | data | level |
|----+----------+------+-------+
| 1  | 0        | 42   | 1     |
| 2  | 1        | 1    | 2     |
+----+----------+------+-------+

ここから、データをルート レベルまで合計するレポートを作成する必要があります。たとえば、レポートは id 1 のデータの合計が 43 であることを示します。確かなことは、レベルがどれくらい深いかということです。子レベルが存在しないインスタンスもあれば、ツリーが存在するインスタンスもあります。いくつかのレベルの深さ。

私が今考えている選択肢は2つあります。1 つは、利用可能な場合は合計で各レベルのデータを表示するドリルダウン レポートを作成することです。例えば:

-Level1a SUM_LEVEL2_AND_LEVEL1a_DATA
   Level2a DATA
   Level2b DATA
  -Level2c SUM_LEVEL3_AND_LEVEL2c_DATA 
      Level3a DATA
Level1b DATA
Level1c DATA

もう 1 つは、データをルートまで合計し、親の合計のみを含む単純なテーブルをレポートに表示することです。例えば:

Level1a SUM_LEVEL1A_AND_ALL_CHILDREN_DATA
Level1b SUM_LEVEL1B_AND_ALL_CHILDREN_DATA
Level1c SUM_LEVEL1C_AND_ALL_CHILDREN_DATA

私が行ったグーグルでドリルダウンレポートを機能させる方法を理解できないようです(ここには便利なリンクがありますが、機能させることができませんでした)。

データベース スキーマを変更することはできません。

始めるために使用できる優れたリソースを知っている人、またはこれを進める方法についてアイデアがある人はいますか?

何か不足している場合はお知らせください...

4

1 に答える 1

0

私はついにこれに対する解決策を見つけました。

共通テーブル式 (CTE) は良いスタートでした。私が行った唯一の変更は、再帰的な定義でした。各子の直接の親の ID を収集する代わりに、祖父母の ID (直接の親が持っていた親 ID) を割り当てました。これは、階層内で 1 ステップだけ上に移動するのではなく、すべての子に最終的な親 ID が割り当てられることを意味していました。そこから、これをレポートで使用するのは非常に簡単でした。

CTE を独自のストアド プロシージャに配置しました。唯一の目的は、階層全体を元に戻すことです。そこから、CTE を別のストアド プロシージャと組み合わせた別のストアド プロシージャを作成しました。この時点で、フィルターを適用し、最終的な結果セットを返しました。

于 2011-05-13T21:40:18.973 に答える