私は 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つのポインタだけを探していただければ幸いです.
ありがとうございました