1

Oracle と SSRS を使用してビジネスのレポートを作成しています。このレポートでは、英数字で構成できるシリアル番号の連続した範囲を集計する必要があります。

たとえば、次のシリアルがあるとします。

OPS114
OPS115
OPS116
OPS117
OPS145
OPS146
OPS160
890RPT
896RPT
897RPT

レポートには、次のように、連続する範囲ごとに 1 つの集計行があり、各範囲の数が含まれている必要があります。

OPS114 - OPS117 (4)
OPS145 - OPS146 (2)
OPS160 - OPS160 (1)
890RPT - 890RPT (1)
896RPT - 897RPT (2)

必要なデータを取得し、それをテーブル変数に一括収集しています。次に、行を集計する必要があります。データを操作するだけであれば問題ありませんが、refcursor のクエリとしてこれを使用できるようにする必要があります。PL/SQL FOR ループの refcursor を開くことはできますか? それとも間違ったツリーを表示していますか? これを Google で検索しようとしましたが、「カーソル for ループ」は探しているものではありません。別の方法は、VB を使用して SSRS で結果を集計することです。(いずれにせよ、それは良い時期ではありません。) このための SQL テーブル タイプを作成するアクセス権があるかどうかわからないので、これは私が探していた代替手段です。

誰かがこれについて経験を持っているなら、それは大歓迎です!

4

2 に答える 2

0

単一の SQL ステートメントからこれを行うこともできますが、データをより適切に定義する必要があります。列には文字列が格納されていますが、それらを数値として使用して範囲を見つけています。また、数字部分は文字列部分の前または後にあるようです。

このように数字を区切るロジックを書くことができる場合(そして、文字列部分を別の列に保持することもできます)-

114
115
116
117
145
146
160
890
896
897

次に、単純なギャップと島の問題に帰着します。

ステップ 1 - この列とともに rownum を選択します (これは 1 から始まる連続シーケンスになります)

ステップ 2 - この数値データ列から rownum を引きます。

ステップ 3 - その結果でグループ化する

ステップ 4 - グループから min(数値) と max(数値) と count(数値) を取得します。これらは、文字列として結合したときに結果になります。

Numeric_part     Rownum      Difference
------------     ------      ------------
114              1           113
115              2           113
116              3           113
117              4           113
145              5           140
146              6           140
160              7           153
890              8           882
896              9           887
897              10          887

これを差分列でグループ化すると、次のようになります -

Difference     Min(num)    Max(num)    count(num)   Result
----------     ---------   ----------  ----------   -----------------
113            114         117         4            114 - 117 (4)
140            145         146         2            145 - 146 (2)
153            160         160         1            160 - 160 (1)
882            890         890         1            890 - 890 (1)
887            896         897         2            896 - 897 (2)

@MickMnemonic のコメントにあるこのリンクのように、その SQL ステートメントを PLSQL で使用してカーソルを返すことができます。

基本的 -

OPEN cursor_variable FOR SELECT something FROM something...;
于 2015-04-07T19:02:27.690 に答える