2013-07-22 58 views
3

我正在編寫一份SSRS報告,起初我以爲我會在報告級別實施這些商業規則,但發現它不如任務。所以現在我可以在SSRS或TSQL級別實現自定義代碼(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,存款準備金率具有零,因此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

你在正確的軌道與排名功能上。試試這個:

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

我正在制定排名和常見分組,然後以該組排名的平均值。

+1

我以前沒見過SQL小提琴。這很酷。如果可以的話,我會再給你一點。此外,我不知道你可以在選擇條款中做這樣的分配操作,所以你今天真的教會了我幾個有價值的東西。謝謝!! – GPGVM

+0

不客氣!對於這類問題,SQL小提琴是一個很好的資源。也就是說,您將DDL添加到您的問題的事實也非常感謝! –