2012-04-26 10 views
6

Ho una domanda che elenca le caratteristiche, in base allo stato dei componenti e la disponibilitàquery SQL moltiplicando risultato SUM per quantità di elementi interni

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) 

I miei risultati sono i seguenti:

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

Invece di

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

Ciascuno di questi marchi ha rispettivamente 8, 8 e 7 modelli. Il che significa che la mia query sta eseguendo per tutti loro il calcolo della priorità: Impact*models + Visibility*models + Risk*models.

Come posso ottenere che la mia query SQL non esegua tale moltiplicazione?

Grazie

+0

è la priorità solo doveva essere il totale dell'impatto, la visibilità e il rischio? – Taryn

+0

Sì @bluefeet è corretto. – LanFeusT

risposta

2

In base al commento e meno che non sto capendo quello che ti serve, non credo che è necessario il SUM(). Penso che tu voglia solo il totale per ogni modello. Usando lo SUM() otterrai il totale di tutti i record che non sembra come desideri. Ciò consentirebbe anche di rimuovere il GROUP BY e 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 ora mi sento stupido per non aver provato quello ... ^^ Grazie! – LanFeusT

+1

@LanFeusT lo facciamo tutti di tanto in tanto. a volte ci vuole un paio di occhi in più. :) – Taryn

Problemi correlati