У меня есть две таблицы

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

Я хочу написать хранимую процедуру, которая будет обновлять Column1 таблицы funddetails.

Column1 рассчитывается как

funddetails.Industry * Industrydetail.price - Avg of funddetails.Industry per state

Если значение меньше или равно -5, верните 50, иначе 100

Это моя хранимая процедура:

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

Я получаю ошибку

Оконные функции могут появляться только в предложениях SELECT или ORDER BY.

Я новичок в SQL Server. Что я делаю не так, или есть лучший подход к тому, что я пытаюсь сделать?

Любая помощь будет оценена. заранее спасибо

-1
Owais Ahmed 25 Окт 2016 в 11:00

2 ответа

Лучший ответ

Измените ваш код, как показано ниже

UPDATE FundDetails
SET Column1= CASE 
 WHEN (funddetails.Industry*Industrydetails.price-
  (select Avg(funddetails.Industry)  OVER (partition BY FundDetails.state)) 
 <= -5 THEN '50' ELSE '100' 
 END
FROM FundDetails 
INNER JOIN Industrydetails  on FundDetails.State = Industrydetails.State 
0
mansi 25 Окт 2016 в 08:35

Вы можете как ниже:

UPDATE FundDetails
SET Column1 = CASE WHEN (funddetails.Industry * t1.price- t2.MyAvg) <= -5 THEN '50' 
            ELSE '100' END
FROM 
    (SELECT fd.*, Avg(fd.Industry)  OVER (partition BY fd.state ) MyAvg FROM FundDetails fd) t2 INNER JOIN 
    IndustryDetails t1 on t1.State = t2.State 
--WHERE FundDetails.Id = t2.Id
0
NEER 25 Окт 2016 в 08:08