4

私は SSRS でレポートを書いています。最初はこれらのビジネス ルールをレポート レベルで実装しようと考えていましたが、タスクよりも劣っていることがわかりました。したがって、SSRS でカスタム コード (vb.net) として実装するか、好みの TSQL レベルで実装することができます。

したがって、ビジネスルールの大部分はすでに満たされています。私が困惑したのは、この最後のステップです。簡単にするために、使用する必要があるデータを表すサンプル テーブルを用意しました。

DECLARE @TeamTable TABLE
(
           TeamID VARCHAR(3),
           AssignedTask INT
)

INSERT INTO @TeamTable VALUES ('AAA', 12)
INSERT INTO @TeamTable VALUES ('BBB', 45)
INSERT INTO @TeamTable VALUES ('CCC', 67)
INSERT INTO @TeamTable VALUES ('DDD', 11)
INSERT INTO @TeamTable VALUES ('EEE', 12)
INSERT INTO @TeamTable VALUES ('FFF', 10)
INSERT INTO @TeamTable VALUES ('GGG', 11)
INSERT INTO @TeamTable VALUES ('HHH', 6)
INSERT INTO @TeamTable VALUES ('III', 3)
INSERT INTO @TeamTable VALUES ('JJJ', 11)
INSERT INTO @TeamTable VALUES ('KKK', 0)
INSERT INTO @TeamTable VALUES ('LLL', 4)
INSERT INTO @TeamTable VALUES ('MMM', 12)
INSERT INTO @TeamTable VALUES ('NNN', 1)
INSERT INTO @TeamTable VALUES ('OOO', 0)
INSERT INTO @TeamTable VALUES ('PPP', 12)
INSERT INTO @TeamTable VALUES ('QQQ', 12)
INSERT INTO @TeamTable VALUES ('RRR', 0)

このクエリは、データセットを正確に表す方法でデータを取得します。

SELECT TT.TeamID, TT.AssignedTask, RANK() OVER 
(ORDER BY TT.AssignedTask DESC) AS 'Rank'
FROM @TeamTable TT
WHERE AssignedTask > 0

ここにトリックがあります。1 つ以上のタスクが割り当てられているチームの数に基づいて、各チームに加重値を割り当てる必要がありますが、次に何をすべきかわかりません。私のサンプル データでは、チーム KKK、OOO、RRR が 0 であるため、15 が最高のポイント値であることがわかります。

DECLARE @RankMax TINYINT
SET @RankMax = @@ROWCOUNT
SELECT @RankMax

つまり、チーム CCC はトップ ドッグであるため 15 ポイントを獲得し、ひねりを加えてスケール ダウンします。BBB は 14 を取得します。

AAA、EEE、MMM、PPP、QQQ はすべて引き分けです。したがって、次の一連のポイントが追加されてから平均化され、全員が平均スコアを取得します。

5 チームが同点なので、13、12、11、10、9 を足して 55 を 5 で割ると、各チームが 11 ポイントを獲得することになります。

次に、JJJ、GGG、DDD に移動します。8 + 7 + 6=21 および 21/3 = 7

残りはゼロになります。したがって、最終的なレコードセットは次のようになります。

TeamID | AssignTask | Rank |
CCC    |     67     |  15
BBB    |     45     | 14
AAA    |     12     | 11
EEE    |     12     | 11
MMM    |     12     | 11
PPP    |     12     | 11
QQQ    |     12     | 11
JJJ    |     11     | 7
GGG    |     11     | 7
DDD    |     11     | 7
FFF    |     10     | 5
HHH    |     6      | 4
LLL    |     4      | 3
III    |     3      | 2
NNN    |     1      | 1

問題に取り組む方法について、私の宿題をする人を探しているのではなく、1つか2つのポインタだけを探していただければ幸いです.

ありがとうございました

4

1 に答える 1

2

あなたはランキング機能で正しい軌道に乗っていました。これを試して:

with RowRank as
(
  select *
    , rownum = row_number() over (order by AssignedTask)
    , rowrank = rank() over (order by AssignedTask) 
  from TeamTable
  where AssignedTask > 0
)
select TeamID
  , AssignedTask
  , [Rank] = avg(rownum) over (partition by rowrank)
from RowRank
order by AssignedTask desc

demo を使用した SQL Fiddle

ランキングと共通のグループ分けを行ってから、そのグループ内のランキングの平均をとっています。

于 2013-07-22T18:59:34.537 に答える