Zählen Sie neue Response und kumulative Prozent pro Monat

Wenn ich mehrere Kunden habe, die Monat für Monat antworten, möchte ich sie nur im ersten Monat zählen, auf den sie antworteten. Ich kann dies erreichen, indem ich Tempel-Tabellen für jeden Monat und Vergleich Monat über Monat, aber es sieht hässlich mit mehreren Temp-Tabellen. Ich bin mir ziemlich sicher, dass es einen besseren path gibt, dies zu tun (ich weiß nicht, ob Rank () arbeiten wird). Kann mir jemand bitte Code zeigen?

declare @Something table ( CustID Char(10), MthId char(2), ResponseDate datetime ) 

Einfügen @Weitere Auswahl 'Cust1', '1', '5/6/13' Union alle wählen 'Cust1', '2', '6/13/13' Union alle wählen 'Cust1', '3', '7 / 13/13 'Gewerkschaft alle wählen' Cust2 ',' 1 ',' 5/20/13 'Union alle wählen' Cust2 ',' 2 ',' 6/22/13 'Union alle wählen' Cust3 ',' 2 ',' 6/20/13 'Union alle wählen' Cust4 ',' 2 ',' 6/24/13 'Union alle wählen' Cust4 ',' 3 ',' 7/24/13 'Union alle wählen' Cust5 ',' 4 ',' 8/28/13 'Gewerkschaft alle wählen' Cust6 ',' 3 ',' 7/24/13 '

Dies ist die Ausgabe, die ich in 3 Spalten erwartet (ich brauche nicht wirklich die 2. Col – es ist da, um weiter zu erklären)

Monat, wie viele "kumulative" neue Kunden reactjsen in diesem Monat, was ist der kumulative Prozentsatz der gesamten Kunden kontaktiert neue jeden Monat.

 MthId NewCustomerResponse CumulativeNewCustomerResponse Cumulative%Responded 1 2 2 33.3 2 2 4 66.7 3 1 5 83.3 4 1 6 100.0 

Einschließlich Ihrer neuen Spalte:

SQLFiddle zur Lösung

 ;with cte as( select ROW_NUMBER() over (partition by CustID order by responseDate) as seq ,* from @Something ) ,cte2 as( select MthId ,(select Count(*) from cte t2 where t1.MthId=t2.MthId and t2.seq=1) NewCustomerResponse ,(select COUNT(*) from cte t2 where t1.MthId>=t2.MthId and t2.seq=1) CumulativeNewCustomerResponse ,(select COUNT(CustID) from cte where seq=1) total from cte t1 group by MthId ) select MthID ,NewCustomerResponse ,CumulativeNewCustomerResponse ,(cast(CumulativeNewCustomerResponse as decimal(3,1))/CAST(total as decimal(3,1)))*100 from cte2 t1 

Überprüfen Sie dies,

  declare @Something table ( CustID Char(10), MthId char(2), ResponseDate datetime ) insert into @Something select 'Cust1', '1', '5/6/13' union all select 'Cust1', '2', '6/13/13' union all select 'Cust1', '3', '7/13/13' union all select 'Cust2', '1', '5/20/13' union all select 'Cust2', '2', '6/22/13' union all select 'Cust3', '2', '6/20/13' union all select 'Cust4', '2', '6/24/13' union all select 'Cust4', '3', '7/24/13' union all select 'Cust5', '4', '8/28/13' union all select 'Cust6', '3', '7/24/13' ;with CTE as (select *,dense_rank()over(partition by custid order by mthid)rn from @Something) ,CTE1 as (select a.MthId,count(*) NewCustomerResponse from cte a where rn=1 group by a.MthId ) ,cte2 as (select sum(NewCustomerResponse) totalresponse from cte1) ,cte4 as ( select a.MthId ,(Select sum(NewCustomerResponse) from CTE1 c where c.mthid<=a.mthid) CumulativeNewCustomerResponse from cte1 a cross apply cte2 b ) select a.MthId,a.NewCustomerResponse ,(Select sum(NewCustomerResponse)from CTE1 c where c.mthid<=a.mthid)CumulativeNewCustomerResponse ,case when b.totalresponse>0 then cast((d.CumulativeNewCustomerResponse /cast(b.totalresponse as float))*100 as decimal(10,2)) else 0 end [Cumulative%Responded] from cte1 a inner join cte4 d on a.MthId=d.MthId cross apply cte2 b