2013-07-22 3 views
3

SSRS에서 보고서를 작성 중이며 처음에는 보고서 수준에서 이러한 비즈 규칙을 구현하지만 작업보다 열등하다고 판단했습니다. 이제 SSRS 나 TSQL 수준에서 사용자 지정 코드 (vb.net)로 구현할 수 있습니다.두 테이블 간의 TSQL 비즈니스 규칙 구현

그래서 비즈니스 규칙의 대부분은 이미 만족했습니다. 그것은 저를 곤란하게 만든 마지막 단계입니다. 간단하게하기 위해 필자는 작업해야하는 데이터를 나타내는 샘플 테이블을 제공했습니다. 현재 이곳에

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

을 트릭입니다 :

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) 

이 쿼리 GET 정확하게 내 데이터 집합을 표현하는 방식으로 데이터를합니다. 하나 이상의 과제가 할당 된 팀의 수를 기반으로 각 팀에 가중치를 부여해야하며 다음에해야 할 일을 모릅니다. 내 샘플 데이터 그래서 당신이 팀 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

나머지는 0이됩니다. 그래서 마지막 레코드는 다음과 같이 보일 것이다 : 숙제에게 문제가 많이 주시면 감사하겠습니다 접근하는 방법 단지 포인터 또는 두 가지를 할 사람을 찾고하지

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 Fiddle을 보지 못했습니다. 멋지다. 내가 할 수만 있다면 그 점에 대해 또 다른 요지를 줄 것입니다. 게다가 저는 여러분이 select 절에서 대입 작업을 할 수 있다는 것을 몰랐습니다. 그래서 여러분은 오늘 저에게 여러 가지 중요한 것들을 가르쳐 주셨습니다. 고맙습니다!! – GPGVM

+0

오신 것을 환영합니다! SQL Fiddle은 이러한 종류의 질문에 유용한 리소스입니다. 즉, DDL을 질문에 추가했다는 사실도 매우 높이 평가됩니다. –