Tengo dos tablas como a continuación. El caseide de la primera tabla se referencia en la segunda tabla junto con los accidentes. Lo que estoy tratando de obtener son accidentes totalmente diferentes para un tipo de caso. Debajo de dos tablas documenté datos de muestra y el resultado esperado.

Cuadro caso :

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

Tabla Accidentes de caso :

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

El resultado debería verse así:

CaseType TotalHIghrating    TotalMediumRating   TotalLOWRating
AB           3          2           2
CD           2          1           1
DE           0          0           0
0
user1098028 5 ene. 2017 a las 04:51

5 respuestas

La mejor respuesta

Para obtener la suma de cada calificación, puede usar una cláusula SUMA (CASO CUANDO), agregando 1 por cada registro que coincida con la calificación.

En su pregunta, ha señalado que desea ver todos los CaseType distintos, puede obtenerlos utilizando una UNIÓN DERECHA, esto incluirá todos los registros de la tabla case.

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       |
+----------+-----------------+-------------------+----------------+

Compruébelo: http://rextester.com/MCGJA9193

2
McNets 5 ene. 2017 a las 02:21

Por favor mira esto. Consulta de muestra de la tabla y también ese resultado

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'

Mi guion

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

Espero que esto pueda ayudar!

0
Jacky Montevirgen 5 ene. 2017 a las 02:17

¿Has usado mayúsculas y minúsculas en una cláusula select antes?

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
0
user3112728 5 ene. 2017 a las 01:58

Otro enfoque utilizando el operador Pivot

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 
0
Pரதீப் 5 ene. 2017 a las 03:49

Prueba este código una vez.

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
0
Mahesh.K 5 ene. 2017 a las 04:13