【问题标题】:SQL Server stored procedure update errorSQL Server 存储过程更新错误
【发布时间】:2016-10-25 08:00:34
【问题描述】:

我有两张桌子

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

我想写一个存储过程来更新Column1funddetails 表。

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 的新手。我做错了什么,或者有没有更好的方法来做我想做的事情?

任何帮助将不胜感激。提前致谢

【问题讨论】:

  • 您是否尝试过将分析子句放在子查询中,并将UPDATECASE 放在外部查询中?
  • 为什么给我-1?

标签: sql sql-server stored-procedures subquery


【解决方案1】:

如下修改你的代码

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 

【讨论】:

    【解决方案2】:

    你可以如下:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-14
      • 1970-01-01
      • 2019-10-17
      • 2018-10-04
      • 2012-05-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多