2013-04-08 136 views
0

我的遞歸查詢需要一些幫助,以獲得我的SSRS報告的直接計數(所有成員(子))和總數(所有團隊成員)。SQL Server 2008/Reporting Services查詢

這是我目前的查詢和結果集。

WITH AgentHierarchy([Name], AId, UId, HLevel, ContractDate) 
AS 
(SELECT 
    FirstName + ' ' + LastName AS Name, AId, UId, 
    0 AS HLevel, ContractDate      
FROM tbl_Asso 
WHERE (AId ='A049') 

UNION ALL 

SELECT  
    e.FirstName + ' ' + e.LastName AS Name, 
e.AId, e.UId, 
    eh.HLevel + 1 AS HLevel, e.ContractDate 
FROM   
    tbl_Asso AS e 
INNER JOIN 
    AgentHierarchy AS eh ON eh.AId = e.UId) 
SELECT 
    AId, Name, 
(select u.FirstName + ' ' + u.LastName 
    from tbl_Asso u 
    where u.AId = d.UId) as Upline, 
    UId, 
    HLevel, 
    ContractDate, 
    (Select count(*) 
    from tbl_Asso as dc 
    where dc.UId = d.AId) As DirectCount 
FROM  
    AgentHierarchy AS d 
ORDER BY 
    HierarchyLevel 

目前的結果集

AId Name   Upline  UId HLevel ContractDate DirectCount 
-----------------------------------------------------------------------  
A049 King Bori  Cindy Hoss A001 0 8/29/2012 5 
A052 Kac Marque King Bori  A049 1 11/6/2012 0 
A050 Joseph Moto King Bori  A049 1 10/9/2012 1 
A059 Nancy Ante King Bori  A049 1 3/27/2013 1 
A053 Kathy May  King Bori  A049 1 11/15/2012 2 
A057 Robert Murphy King Bori  A049 1 2/12/2013 1 
A051 Andy Jane  Joseph Moto A050 2 2/14/2013 0 
A060 Arian Colle Nancy Ante A059 2 3/26/2013 0 
A058 Phil Hunk  Robert Murphy A057 2 3/21/2013 0 
A055 Rea Wane  Kathy May  A053 2 2/20/2013 1 
A054 Gabby Orez Kathy May  A053 2 12/7/2012 0 
A056 Steve Wells Rea Wane  A055 3 3/25/2013 0 

我需要改變上面的查詢,以獲得直接計數(所有成員(兒童)直接)和TotalTeam計數根據合同日期

例如,2013年1月3日至2013年3月31日期間的合同日期。我需要獲得以下結果集。

我需要把對contractDate參數(使他們能夠得到的範圍內,或者如果它爲null,則他們得到所有的記錄和計數。

如(@BeginDate和@EndDate之間ContractDate)或((@BeginDate爲空)和(@EndDate爲null))

AId Name   Upline  UId HLevel ContractDate DirectCount TotalTeam 
--------------------------------------------------------------------------------- 
A049 King Bori  Cindy Hoss A001 0 8/29/2012 1  4 
A052 Kac Marque King Bori  A049 1 11/6/2012 0  0 
A050 Joseph Moto King Bori  A049 1 10/9/2012 0  0 
A059 Nancy Ante King Bori  A049 1 3/27/2013 1  1 
A053 Kathy May  King Bori  A049 1 11/15/2012 0  0 
A057 Robert Murphy King Bori  A049 1 2/12/2013 1  1 
A051 Andy Jane  Joseph Moto A050 2 2/14/2013 0  0 
A060 Arian Colle Nancy Ante A059 2 3/26/2013 0  0 
A058 Phil Hunk  Robert Murphy A057 2 3/21/2013 0  0 
A055 Rea Wane  Kathy May  A053 2 2/20/2013 1  1 
A054 Gabby Orez Kathy May  A053 2 12/7/2012 0  0 
A056 Steve Wells Rea Wane  A055 3 3/25/2013 0  0 

在此先感謝。

回答

0

我不能肯定,但你在你的遞歸CTE做一個人一個明確的上市,這將限制範圍僅限於那個人和他們的父母ONL Y.除非你在一組數百萬條記錄上進行遞歸,否則它應該能夠在正則表達式的底部處理謂詞,而不是在遞歸CTE中處理它自己。假設你正在處理適當的最大遞歸級別。對於您的合同日期,只需將該表格留在鏈接遞歸的底部。除非你需要先獲得他們的水平。在那種情況下,我會在第一個cte中獲取這些數據,然後列出第二個數據,然後再做這個數據。

這裏是一個簡單的例子,我做了包括聯合銷售,基本上我形成了遞歸,而不是id特定的,我發現最大遞歸(如果你想離開那部分)找到最低葉級,然後我執行所需的結束謂詞。我希望這有幫助。很多時候,我看到人們在遞歸CTE中列出謂詞,這會限制它們的範圍,記住遞歸本質上限制了n次以上的層次。你可以在該點之前和之後獲得你需要的數據,但是在那裏做謂詞會限制這個範圍導致的地方。

Declare @table table (PersonId int identity, PersonName varchar(512), Account int, ParentId int, Orders int); 

insert into @Table values ('Brett', 1, NULL, 1000),('John', 1, 1, 100),('James', 1, 1, 200),('Beth', 1, 2, 300),('John2', 2, 4, 400); 

select 
    PersonID 
, PersonName 
, Account 
, ParentID 
from @Table 

; with recursion as 
    (
    select 
     t1.PersonID 
    , t1.PersonName 
    , t1.Account 
    --, t1.ParentID 
    , cast(isnull(t2.PersonName, '') 
      + Case when t2.PersonName is not null then '\' + t1.PersonName else t1.PersonName end 
      as varchar(255)) as fullheirarchy 
    , 1 as pos 
    , cast(t1.orders + 
      isnull(t2.orders,0) -- if the parent has no orders than zero 
      as int) as Orders 
    from @Table t1 
     left join @Table t2 on t1.ParentId = t2.PersonId 
    union all 
    select 
     t.PersonID 
    , t.PersonName 
    , t.Account 
    --, t.ParentID 
    , cast(r.fullheirarchy + '\' + t.PersonName as varchar(255)) 
    , pos + 1 -- increases 
    , r.orders + t.orders 
    from @Table t 
     join recursion r on t.ParentId = r.PersonId 
    ) 
, b as 
    (
    select *, max(pos) over(partition by PersonID) as maxrec -- I find the maximum occurrence of position by person 
    from recursion 
    ) 
select * 
from b 
where pos = maxrec -- finds the furthest down tree 
-- and Account = 2 -- I could find just someone from a different department