2012-04-26 24 views
6

tengo una consulta que se enumeran características, basadas en estado de los componentes y la disponibilidadconsulta SQL multiplicando resultado SUM cantidad de elementos internos

SELECT Brand.Id 
    , Brand.Name 
    , Brand.Impact 
    , Brand.Visibility 
    , Brand.Risk 
    , SUM(Brand.Impact + Brand.Visibility + Brand.Risk) AS Priority 

FROM Brand 
LEFT OUTER JOIN Type 
    ON Brand.Id = Type.FeatureId 
LEFT OUTER JOIN Model 
    ON Type.Id = Model.SubFeatureId 
LEFT OUTER JOIN TestingStatus 
    ON Model.StatusId = TestingStatus.Id 

WHERE (Model.IsDeleted = 'False') 
    AND (Brand.IsDeleted = 'False') 
    AND (Type.IsDeleted = 'False') 
    AND (@TeamId = 0 OR Model.TeamId = @TeamId) 
GROUP BY Brand.YearId, Brand.Id, Brand.Name, Brand.Impact, Brand.Visibility, Brand.Risk 
HAVING (Brand.YearId = @YearId) 

Mis resultados son los siguientes:

ID Name Impact Visibility Risk Priority 
403 Chevy 1  2   3  48 
404 Nissan 1  1   1  24 
405 Toyota 3  2   1  42 

En lugar de

ID Name Impact Visibility Risk Priority 
403 Chevy 1  2   3  6 
404 Nissan 1  1   1  3 
405 Toyota 3  2   1  6 

Cada una de estas marcas tiene, respectivamente, 8, 8 y 7 modelos. Lo que significa que mi consulta está haciendo para todos ellos para calcular la prioridad: Impact*models + Visibility*models + Risk*models.

¿Cómo puedo hacer que mi consulta SQL no haga esa multiplicación?

Gracias

+0

es su prioridad simplemente supone que es el total del impacto, la visibilidad y el riesgo? – Taryn

+0

Sí @bluefeet eso es correcto. – LanFeusT

Respuesta

2

Basado en su comentario y, a menos que no soy la comprensión de lo que necesita, no creo que necesita el SUM(). Creo que solo quieres el total para cada modelo. Con el SUM() obtendrá el total de todos los registros que no suenen como usted quiere. Esto también eliminaría su GROUP BY y HAVING

SELECT Brand.Id 
    , Brand.Name 
    , Brand.Impact 
    , Brand.Visibility 
    , Brand.Risk 
    , (Brand.Impact + Brand.Visibility + Brand.Risk) AS Priority 

FROM Brand 
LEFT OUTER JOIN Type 
    ON Brand.Id = Type.FeatureId 
LEFT OUTER JOIN Model 
    ON Type.Id = Model.SubFeatureId 
LEFT OUTER JOIN TestingStatus 
    ON Model.StatusId = TestingStatus.Id 

WHERE (Model.IsDeleted = 'False') 
    AND (Brand.IsDeleted = 'False') 
    AND (Type.IsDeleted = 'False') 
    AND (@TeamId = 0 OR Model.TeamId = @TeamId) 
    AND (Brand.YearId = @YearId) 
+0

Ok, ahora solo me siento estúpido por no intentar eso ... ^^ ¡Gracias! – LanFeusT

+1

@LanFeusT todos lo hacemos de vez en cuando. a veces toma un par de ojos extra. :) – Taryn

Cuestiones relacionadas