来自另外两列

时间:2018-02-08 11:38:11

标签: sql-server tsql syntax sum

我有一个总结问题。我尝试使用其他两列的SUM更新列,并且我收到错误"聚合可能不会出现在UPDATE语句的集合列表中。"。我尝试使用子查询,但我得到了同样的错误。有人可以请我直截了当地说明我需要做什么才能让我的头发脱落! (不是真的;))

    UPDATE t SET Admin4=
         CASE WHEN cb.ProductID=vp.ProductID THEN CAST(SUM(vp.Split) - 
 SUM(rl.Split)
AS money) ELSE '' END
FROM #tmp t
INNER JOIN SCH.dbo.tblProducts vp ON t.ProductID=vp.ProductID
INNER JOIN SCH.dbo.tblProductsChargeBack cb ON vp.productID=cb.productID
INNER JOIN SCH.dbo.tblLookUp rl ON vp.LookupID=rl.LookUpID;  

3 个答案:

答案 0 :(得分:0)

试试这个。它可以帮到你

  ;WITH CTE AS (
SELECT cb.ProductID,CASE WHEN cb.ProductID=vp.ProductID THEN CAST(SUM(vp.Split) - SUM(rl.Split) AS money) ELSE '' END  AS Admin4
FROM #tmp t
INNER JOIN SCH.dbo.tblProducts vp ON t.ProductID=vp.ProductID
INNER JOIN SCH.dbo.tblProductsChargeBack cb ON vp.productID=cb.productID
INNER JOIN SCH.dbo.tblLookUp rl ON vp.LookupID=rl.LookUpID
GROUP BY  cb.ProductID
)

UPDATE T SET T.Admin4=c.Admin4
from #tmp t
 INNER JOIN cte c on  t.ProductID=c.ProductID

注意:您正在尝试转换为数据类型MoneyMoney and SmallMoney数据类型适用于SQL Server (starting with 2008)。如需参考,请点击Money and Small Money

答案 1 :(得分:0)

你可以试试这个。

UPDATE t SET Admin4=
                (SELECT CAST(SUM(vp.Split) - SUM(rl.Split) AS money) FROM 
        SCH.dbo.tblProducts vp 
        INNER JOIN SCH.dbo.tblProductsChargeBack cb ON vp.productID=cb.productID
        INNER JOIN SCH.dbo.tblLookUp rl ON vp.LookupID=rl.LookUpID; 
        WHERE t.ProductID=vp.ProductID )
FROM #tmp t

答案 2 :(得分:0)

只是清理版本的更新

UPDATE t 
SET Admin4 = CASE WHEN cb.ProductID = vp.ProductID THEN CAST(SUM(vp.Split-rl.Split) AS money) 
                  ELSE '' 
             END
FROM #tmp t
INNER JOIN SCH.dbo.tblProducts vp 
        ON t.ProductID  = vp.ProductID
INNER JOIN SCH.dbo.tblProductsChargeBack cb 
        ON cb.productID = vp.productID
INNER JOIN SCH.dbo.tblLookUp rl 
        ON rl.LookUpID  = vp.LookupID;

您不能在更新中使用聚合(总和)。除了聚合需要一个分组。

CASE WHEN cb.ProductID = vp.ProductID 

上面没有任何意义,因为这是一个连接条件,并且永远是真的。

试试这个

UPDATE t 
SET Admin4 = tt.ssum
FROM #tmp t 
JOIN (select vp.productID
           , CAST(SUM(vp.Split-rl.Split) AS money)  as ssum  
        FROM SCH.dbo.tblProducts vp             
        JOIN SCH.dbo.tblProductsChargeBack cb 
          ON cb.ProductID = vp.ProductID
        JOIN SCH.dbo.tblLookUp rl 
          ON rl.LookUpID  = vp.LookupID 
       GROUP BY vp.productID)
     ) tt 
  ON t.productID = tt.productID

由于没有使用cb,所以没有看到JOIN SCH.dbo.tblProductsChargeBack cb的目的。