2016-06-27 2 views
0

wenn ich eine Tabelle, Aufgaben mit den folgenden BeispielzeilenAbfrage zu zählen Reihen gegeben ID eines SQL Server Geschwister 2012

ID ParentID Status 
1 101  Pending 
2 101  Complete 
3 101  Complete 
4 102  Complete 

Gegeben ID = 2, wie kann ich Anzahl von Aufgaben bekommen nicht abgeschlossen, die gehören zum selben Elternteil? z.B.

Select Count(ID) from Tasks where Status <> ‘Complete’ and ID =2 

obige Abfrage tut korrekte Ergebnisse zurück

Hinweis, ich will nicht Select Count (ID) von Aufgaben zu tun, wo Der Status <> 'Complete' und ParentID = 101 dh ich will nicht Übergeben der ParentID in der Abfrage, nur ID eines der Datensätze, die zum selben Parent gehören.

danke.

Antwort

1

Ein Verfahren verwendet eine Unterabfrage:

Select Count(t.ID) 
from Tasks t 
where t.Status <> 'Complete' and 
     t.ParentId = (select t2.parentId from Tasks t2 where t2.ID = 2); 
+0

Danke. Gibt es eine Möglichkeit, dies mit 'Where t2.ID = 2' außerhalb der Unterabfrage zu tun? –

+0

@BillAnderson. . . Was ist das Problem mit der Bedingung in der Unterabfrage? –

0

Die folgende Abfrage eine Unterabfrage verwendet die Anzahl der Geschwister Aufgaben zu tun (mit kommentierten Code den „Startpunkt“ auszuschließen)

select 
    ParentId, 
    Status, 
    (select count(*) from Tasks t2 where t2.ParentId = t.ParentId and Status <> 'Complete' 
    -- and t2.Id <> t.Id 
) as SiblingTaskCount 
from Tasks t 
Where t.Id = 2 
0

Versuchen Sie dies,

declare @t table(ID int,ParentID int,[Status] varchar(50)) 
insert @t values 
(1,101,'Pending') 
,(2,101,'Complete') 
,(3,101,'Complete') 
,(4,102,'Complete') 
declare @id int=2 
select * 
from @t A 
inner join 
@t B on a.ParentID=b.ParentID 
where [email protected] 
and a.Status='Pending' 

--OR 

;With CTE as 
(
select id,parentid,[Status],1 rn from @t where [email protected] 
union all 
select a.id,a.ParentID,a.[Status], 
rn+1 
from @t A 
inner join cte b 
on a.ParentID=b.ParentID 
where a.id<>@id 
and a.[Status]='Pending' 
and b.rn<2 

) 

select * from cte 
where rn>1