两个表之间的TSQL业务规则实现

时间:2013-07-22 18:24:14

标签: sql-server tsql

我正在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团队为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 个答案:

答案 0 :(得分:1)

您使用排名功能走在正确的轨道上。试试这个:

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 with demo

我正在计算排名和常见分组,然后取得该组排名的平均值。