4

我正在 SSRS 中编写报告,起初我以为我会在报告级别实施这些商业规则,但发现它不如任务。所以现在我可以在 SSRS 或 TSQL 级别实现自定义代码(vb.net),这将是我的偏好。

所以大部分的业务规则我已经满足了。正是这最后一步让我难住了。为简单起见,我提供了一个示例表,代表我需要处理的数据。

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 团队为零,因此 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

不寻找任何人来做我的功课只是一个或两个关于如何解决问题的指针将不胜感激。

谢谢你

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

SQL Fiddle 与演示

我正在计算排名和共同分组,然后取该组中排名的平均值。

于 2013-07-22T18:59:34.537 回答