Implémentation de règles métier TSQL entre deux tables

J'écris un rapport dans SSRS et j'ai d'abord pensé que j'allais implémenter ces règles biz au niveau du rapport mais le find inférieur à la tâche. Donc maintenant je peux soit implémenter en tant que code personnalisé (vb.net) dans SSRS ou au niveau TSQL qui serait ma preference.

Donc, la majorité de la règle commerciale que j'ai déjà satisfaite. C'est cette dernière étape qui m'a bloqué. Pour simplifier, j'ai fourni un exemple de tableau qui représente datatables avec lesquelles je dois travailler.

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) 

Cette requête obtient datatables d'une manière qui représente précisément mon set de données:

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

Maintenant, voici l'astuce. Je dois atsortingbuer une valeur pondérée à chaque équipe en fonction du nombre d'équipes qui ont une ou plusieurs tâches assignées et je ne sais pas quoi faire ensuite. Donc, dans mes données d'exemple, vous verrez que les équipes KKK, OOO, RRR ont zéro donc 15 est notre valeur de pointe et je l'obtiens en utilisant:

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

Donc l'équipe de CCC obtient 15 points parce qu'ils sont des chiens de haut niveau et que ça se réduit … avec une torsion. BBB obtient 14.

AAA, EEE, MMM, PPP, QQQ tous liés. Ainsi, les points suivants sont ajoutés puis moyennés et tout le monde obtient le score moyen.

Donc 5 équipes liées ainsi 13,12,11,10,9 sont additionnées pour égaler 55 divisé par 5 signifie que chaque équipe obtient 11 points.

Ensuite, nous passons à JJJ, GGG, DDD une autre cravate. 8 + 7 + 6 = 21 et 21/3 = 7

Le rest descend à zéro. Donc, le dernier jeu d'loggings ressemblerait à ceci:

 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 

Ne cherchez pas quelqu'un pour faire mes devoirs juste un pointeur ou deux dans la façon d'aborder le problème serait très apprécié.

Je vous remercie

Vous étiez sur la bonne voie avec les fonctions de classment. Essaye ça:

 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 

SQL Fiddle avec une démo .

Je travaille sur le classment et le groupement commun, puis sur la moyenne des classments dans ce groupe.