2016-10-26 4 views
1

У меня есть две таблицыSQL Server хранимая процедура расчета неправильно среднедушевой состояния

Funddetails:

FundId Fund Industry State Column1 
----------------------------------------- 
    1  1  2  NSW    
    2  1  2  ACT   
    3  1  2  VIC   
    4  1  2  NSW   
    5  1  2  ACT   
    6  1  2  VIC   
    7  1  2  NSW   
    8  1  2  ACT   
    9  1  2  VIC  

Industrydetail:

IndustryId price State 
----------------------- 
    1   12 NSW 
    2   1 Vic 
    3   3 ACT 

Это, как я обновить столбец 1

UPDATE FundDetails 
SET Column1 = CASE 
       WHEN (funddetails.Industry * Industrydetails.price - 
         (select Avg(funddetails.Industry * Industrydetails.price) OVER (partition BY Industrydetails.state)) <= -5 
        THEN '50' 
        ELSE '100' 
       END 
FROM FundDetails 
INNER JOIN Industrydetails ON FundDetails.State = Industrydetails.State 

Но средний расчет дает неправильный результат.

funddetails.Industry*Industrydetails.price и (select Avg(funddetails.Industry*Industrydetails.price) OVER (partition BY Industrydetails.state)) дают то же результаты.

Есть ли другой способ получить

average(funddetails.Industry * Industrydetails.price) 

за состояние и обновлять колонку

+0

FWIW: AVG (INT) -> INT. – user2864740

+0

Извините, что это такое –

+0

Как плохого расчета? – ZLK

ответ

1
;WITH AvgIndustryPrice (State, AverageIndustryPrice) AS 
(
    SELECT 
     FundDetails.State, 
     AVG (FundDetails.Industry * IndustryDetail.Price) 
    FROM 
     FundDetails 
    JOIN 
     IndustryDetail 
    ON 
     FundDetails.State = IndustryDetail.State 
    GROUP BY 
     FundDetails.State 
) 
UPDATE 
    FundDetails 
SET 
    Column1 = 
    CASE 
     WHEN funddetails.Industry * Industrydetails.price - AvgIndustryPrice.AverageIndustryPrice <= -5 
     THEN '50' 
     ELSE '100' 
    END 
FROM 
    FundDetails 
JOIN 
    AvgIndustryPrice 
ON 
    FundDetails.State = AvgIndustryPrice.State 
0

Я думаю, ваш запрос дает правильный ответ. вы добавили данные в таблицу таким образом, чтобы дать тот же результат для обоих (funddetails.Industry * Industrydetails.price) и AVG (FundDetails.Industry * IndustryDetail.Price)