Sql server 两个表之间的TSQL业务规则实现
我正在用SSRS编写一份报告,起初我以为我会在报告级别执行这些业务规则,但发现它不如任务。所以现在我可以在SSRS中实现为自定义代码(vb.net),也可以在TSQL级别实现,这是我的首选 因此,我已经满足了大部分业务规则。正是这最后一步让我难堪。为了简单起见,我提供了一个示例表,它表示我需要处理的数据Sql server 两个表之间的TSQL业务规则实现,sql-server,tsql,Sql Server,Tsql,我正在用SSRS编写一份报告,起初我以为我会在报告级别执行这些业务规则,但发现它不如任务。所以现在我可以在SSRS中实现为自定义代码(vb.net),也可以在TSQL级别实现,这是我的首选 因此,我已经满足了大部分业务规则。正是这最后一步让我难堪。为了简单起见,我提供了一个示例表,它表示我需要处理的数据 DECLARE @TeamTable TABLE ( TeamID VARCHAR(3), AssignedTask INT ) INSERT IN
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
现在是诀窍。我必须根据分配了一个或多个任务的团队数量为每个团队分配一个加权值,我不知道下一步该做什么。在我的样本数据中,你们会看到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
不要找人做我的家庭作业,只要教我如何解决这个问题就好了
谢谢你你的排名功能是正确的。试试这个:
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。那很酷。如果可以的话,我会再给你一分。此外,我不知道您可以在select子句中执行类似的赋值操作,所以您今天真的教会了我一些有价值的东西。非常感谢。不客气!SQLFiddle是解决这类问题的绝佳资源。也就是说,您将DDL添加到问题中的事实也非常感谢!