2016-06-20 17 views
1

Ich habe Tabelle mit zwei Spalten, eine int und anderen varchar Spaltefinden Bereich, in dem spezifischen Status Nullzählung

id status 
int varchar(50) 

Die Statusspalte hat 10 Status, sagen wir status1, status2, Status3, ... status10

Ich möchte eine Abfrage schreiben, um maximale Reichweite zu finden, wo Status7, Status8, Status9 zählen (*) ist Null.

ich mit dieser Abfrage gestartet,

Select status, count(*) from table1 where id between 1 and 1000 group by status 

Select status, count(*) from table1 where id between 1001 and 2000 group by status 

Hier bei Zähler Null ist, es ist nicht enthalten. Kann meine Anforderung in einer guten Einzelabfrage erfüllt werden?

Tabellendaten,

Id Status 
1 status1 
2 status2 
3 status3 
4 status4 
5 status5 
6 status6 
7 status7 
8 status8 
9 status9 
10 status10 
11 status1 
12 status2 
13 status3 
14 status4 
15 status5 
16 status9 
17 status2 
18 status7 
19 status3 
20 status5 
...... 
1000 status6 

Meine erste gewünschte Ausgabe

Wenn ich zwischen 15 und 20 verwenden,

**Status  Count** 
status1  0 
status2  1 
status3  1 
status4  0 
status5  2 
status6  0 
status7  1 
status8  0 
status9  1 
status10  0 

Weiter, wenn möglich, möchte ich einen Bereich finden, wo diese 3 Status 8, 9 10 sind Null.

+2

Können Sie einige Beispieldaten und die gewünschte Ausgabe teilen. Es ist nicht klar aus "eine Abfrage zu finden, maximale Reichweite wo Status7, Status8, Status9 Count (*) ist Null." Was meinst du. Ihr sql-Versuch fügt auch nicht viele Hinweise hinzu. – JNevill

+0

Was meinen Sie mit "maximale Reichweite"? –

+0

Eine Zahl von X bis unendlich scheint die maximale Reichweite zu sein, ohne andere Einschränkungen. –

Antwort

0

müssen Sie eine statische Tabelle erstellen, die Zustände, um es nur dann beitreten hat wie

select * into #data from (
select 1 id, 'status1' [status] union 
select 2 id, 'status2' [status] union 
select 3 id, 'status3' [status] union 
select 4 id, 'status4' [status] union 
select 5 id, 'status5' [status] union 
select 6 id, 'status6' [status] union 
select 7 id, 'status7' [status] union 
select 8 id, 'status8' [status] union 
select 9 id, 'status9' [status] union 
select 10 id, 'status10' [status] union 
select 11 id, 'status1' [status] union 
select 12 id, 'status2' [status] union 
select 13 id, 'status3' [status] union 
select 14 id, 'status4' [status] union 
select 15 id, 'status5' [status] union 
select 16 id, 'status9' [status] union 
select 17 id, 'status2' [status] union 
select 18 id, 'status7' [status] union 
select 19 id, 'status3' [status] union 
select 20 id, 'status5' [status] 
) x 


select * into #table from (
select  'status1'  [status] union 
select  'status2'  [status] union 
select  'status3'  [status] union 
select  'status4'  [status] union 
select  'status5'  [status] union 
select  'status6'  [status] union 
select  'status7'  [status] union 
select  'status8'  [status] union 
select  'status9'  [status] union 
select  'status10' [status]) x 

--=========================================gets the result for between 15 and 20 
select x.status , count(y.id) 
from #table x 
left join #data y 
on x.status = y.status 
and id between 15 and 20 
group by x.status 


--==============================================this should give you the ranges 


select *,row_number() over (order by id) rowid 
into #range 
from #data 
where id not in (
select distinct 
y.id 
from #table x 
left join #data y 
on x.status = y.status 
where x.status in ('status8' , 'status9' , 'status10') 
) 

select x.* 
from #range x 
left join #range y 
on x.rowid = y.rowid + 1 
where x.id - isnull(y.id,0) = 1