SQL Server存储过程正在计算每个状态的错误平均值

SQL Server存储过程正在计算每个状态的错误平均值,sql,sql-server,sql-server-2008,stored-procedures,average,Sql,Sql Server,Sql Server 2008,Stored Procedures,Average,我有两张桌子 基金详情: 行业详情: 这就是我更新第1列的方式 UPDATE FundDetails SET Column1 = CASE WHEN (funddetails.Industry * Industrydetails.price - (select Avg(funddetails.Industry * Industrydetails.price) OVER (partition BY Industry

我有两张桌子

基金详情:

行业详情:

这就是我更新第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

我认为你的查询给出了正确的答案。
;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

您在表中添加数据的方式使funddetails.Industry*Industrydetails.price和AVG funddetails.Industry*Industrydetails.price的结果相同。抱歉,这是什么?平均值计算有何错误?您提供的示例数据在您的基金表中的所有行业值都相同,但我猜这部分的问题在于:选择Avgfunddetails.Industry*Industrydetails.price OVER partition BY Industrydetails.state摆脱选择,只需使用Avgfunddetails.Industry*Industrydetails.price OVER partition BY Industrydetails.state,看看这是否会得到您期望的结果。@ZLK如果我删除选择,那么我就是获取错误窗口函数只能出现在SELECT或ORDER BY子句中。
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
average(funddetails.Industry * Industrydetails.price)  
;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