SQL Server - Heirarchy Question

Hello all,

I have a table called "Customer" and this table has a few fields CustID and CustParentID, I need to pull together the heirarchy of the parent and child customers based on a passed custid, if the custparentid is null then it is a top level parent for example:

CustID         CustParentID
123             NULL
234             123
345             234
456             345
789             456

Now I may pass to a proc custif 345.   I want a resultset the best way I can get it to show the display order I am going to show the results of the parent and childs so maybe something returned such as:

CustID        RelationshipOrder      
123            1
234            2
345            3
456            4
789            5

Can anyone help the best way I can do this, or a better way possibly?  

Thanks
sbornstein2Asked:
Who is Participating?

Improve company productivity with a Business Account.Sign Up

x
 
chapmandewConnect With a Mentor Commented:
here is one way to do it:

with mycte(custid, custparentid, ordering)
as
(
select custid, custparentid, 1
from #temp
where custparentid is null
union all
select t.custid, t.custparentid , ordering + 1
from #temp t
join mycte c on t.custparentid = c.custid
)

select custid,*  from mycte o
where exists(select 1 from mycte i where custid = 234)
0
 
chapmandewCommented:
here's the data I loaded:

create table #temp(custid int, custparentid int)

insert into #temp
select 123     ,        NULL
union all
select 234      ,       123
union all
select 345     ,        234
union all
select 456     ,        345
union all
select 789     ,        456
0
 
sbornstein2Author Commented:
can't this somehow be done in one query or a nested query?  I am testing this now
0
Free Tool: ZipGrep

ZipGrep is a utility that can list and search zip (.war, .ear, .jar, etc) archives for text patterns, without the need to extract the archive's contents.

One of a set of tools we're offering as a way to say thank you for being a part of the community.

 
sbornstein2Author Commented:
this is perfect though and works great, thank you.
0
 
chapmandewCommented:
glad to help!
0
 
sbornstein2Author Commented:
actually this won't work only in a perfect situation.  Here is what I had in my test table now.

PartyID          PartyName                        PartyParentID
1      Company ABC      NULL
2      Company DEF      1
3      Company GHI      2
4      Company JKL      3
5      Company MNO      4
6      Jack in the Box 2      7
7      Jack in the Box 1      NULL
8      Jack in the Box 3      1
9      Jack in the Box 4      8
10      Jack in the Box 5      8

You can see now there can be more than one child flowing into a parent or another child for that matter.  So here was my results when passing in 3 as the partyid:

PartyID          PartyName                         PartyParentID   Ordering
1      Company ABC      NULL      1
7      Jack in the Box 1      NULL      1
6      Jack in the Box 2      7      2
2      Company DEF      1      2
8      Jack in the Box 3      1      2
9      Jack in the Box 4      8      3
10      Jack in the Box 5      8      3
3      Company GHI      2      3
4      Company JKL      3      4
5      Company MNO      4      5
0
 
sbornstein2Author Commented:
i would only want to show the flow up to the parent if I passed in partyid 3, right now this shows all the records.

with mycte(PartyID, OrgName, MacNum, PartyParentID, ordering)
as
(
select PartyID, OrgName, MacNum, PartyParentID, 1
from Organization
where PartyParentID is null
union all
select t.PartyID, t.OrgName, t.MacNum, t.PartyParentID,
       ordering + 1
from Organization t
join mycte c on t.PartyParentID = c.PartyID
)

select PartyID,*  from mycte o
where exists(select 1 from mycte i where PartyID = 3)
0
 
sbornstein2Author Commented:
ignore the macnum field in that above
0
 
sbornstein2Author Commented:
one thing is I am not sure what ordering would be right if more than one company had the same parent.  I need to find that out.
0
 
sbornstein2Author Commented:
i guess for now is there a way to do this and just order them based on the order of the partyid ascending I guess if there is more than one with the same parent?  Just a thought
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.