SQL-Abfragesumme der entsprechenden entsprechenden Zeilen

Ich habe zwei Tische wie unten. Caseid aus der ersten Tabelle wird in der zweiten Tabelle zusammen mit Unfällen referenziert. Was ich versuche, völlig unterschiedliche Unfälle für eine Fallart zu bekommen. Unterhalb von zwei Tabellen dokumentierte ich Musterdaten und erwartete Ergebnisse.

Tischkoffer:

caseId CaseType 1 AB 2 AB 3 AB 4 CD 5 CD 6 DE 

Tisch FallAccidents :

 AccidentId caseID AccidentRating 1 1 High 2 1 High 3 1 Medium 4 1 LOW 5 2 High 6 2 Medium 7 2 LOW 8 5 High 9 5 High 10 5 Medium 11 5 LOW 

Ergebnis sollte wie folgt aussehen:

 CaseType TotalHIghrating TotalMediumRating TotalLOWRating AB 3 2 2 CD 2 1 1 DE 0 0 0 

Um die Summe von jeder Bewertung zu erhalten, kannst du eine SUM (CASE WHEN) -Klausel verwenden, indem du 1 von jedem datasatz addierst, der dem Rating entspricht.

In Ihrer Frage haben Sie darauf hingewiesen, dass Sie alle verschiedenen CaseType sehen CaseType , können Sie es mit einem RECHTEN JOIN, dies wird alle datasätze der CaseType enthalten.

 select case.CaseType, sum(case when caseAccidents.AccidentRating = 'High' then 1 else 0 end) as TotalHighRating, sum(case when caseAccidents.AccidentRating = 'Medium' then 1 else 0 end) as TotalMediumRating, sum(case when caseAccidents.AccidentRating = 'LOW' then 1 else 0 end) as TotalLowRating from caseAccidents right join case on case.caseId = caseAccidents.caseID group by case.CaseType; +----------+-----------------+-------------------+----------------+ | CaseType | TotalHighRating | TotalMediumRating | TotalLowRating | +----------+-----------------+-------------------+----------------+ | AB | 3 | 2 | 2 | +----------+-----------------+-------------------+----------------+ | CD | 2 | 1 | 1 | +----------+-----------------+-------------------+----------------+ | DE | 0 | 0 | 0 | +----------+-----------------+-------------------+----------------+ 

Überprüfen Sie es: http://rextester.com/MCGJA9193

Haben Sie den Fall in einer select-Klausel vor?

 select C.CaseType, sum(case when CA.AccidentRating = 'High' then 1 else 0 end) from Case C join CaseAccidents CA on C.CaseId = CA.CaseId group by C.CaseType 

Bitte sehen Sie dies. Beispielabfrage der Tabelle und auch das Ergebnis

 create table #case(caseid int,casetype varchar(5)) insert into #case (caseid,casetype) select 1,'AB' union all select 2,'AB' union all select 3,'AB' union all select 4,'CD' union all select 5,'CD' union all select 6,'DE' create table #CaseAccidents(AccidentId int, CaseId int,AccidentRating varchar(10)) insert into #CaseAccidents(AccidentId, CaseId, AccidentRating) select 1,1,'High' union all select 2,1,'High' union all select 3,1,'Medium' union all select 4,1,'Low' union all select 5,2,'High' union all select 6,2,'Medium' union all select 7,2,'Low' union all select 8,5,'High' union all select 9,5,'High' union all select 10,5,'Medium' union all select 11,5,'Low' 

Mein Drehbuch

 select c.casetype, sum(case when ca.AccidentRating='High' then 1 else 0 end) as TotalHighRating, sum(case when ca.AccidentRating='Medium' then 1 else 0 end) as TotalMediumRating, sum(case when ca.AccidentRating='Low' then 1 else 0 end) as TotalLowRating from #case c Left join #CaseAccidents ca on c.Caseid=ca.Caseid group by c.casetype 

Hoffnung Das könnte helfen!

Ein anderer Ansatz mit Pivot Operator

 SELECT casetype, [High], [Medium], [Low] FROM (SELECT c.casetype, AccidentRating FROM case c LEFT JOIN CaseAccidents ca ON ca.CaseId = c.caseid)a PIVOT (Count(AccidentRating) FOR AccidentRating IN ([High], [Medium], [Low]) ) p 

Versuchen Sie diesen Code einmal.

 select casetype, sum(case when ca.AccidentRating='High' then 1 else 0 end ) as TotalHIghrating, sum(case when ca.AccidentRating='Medium' then 1 else 0 end ) as TotalMediumRating , sum(case when ca.AccidentRating='Low' then 1 else 0 end ) as TotalLOWRating from #case c left join #CaseAccidents ca on c.caseid=ca.CaseId group by casetype