更新列,其中两个值在SQL Server中总和等于零

时间:2014-08-25 13:44:32

标签: sql sql-server

由于我不是最好的SQL,我遇到了一个场景,我必须根据他们的' CtrlNo'来排队。如果结果返回零,那么我不需要显示它们。

我能够对这些记录求和并显示这样的结果..

SELECT CtrlNo, SUM(Amt)/COUNT(DISTINCT CtrlNo)
FROM tContractsInTransit
GROUP BY CtrlNo

这将对不同的CtrlNo求和,结果就像这样..

enter image description here

但是,我需要根据CtrlNo为零的位置更新表中的列。

我试过了..

UPDATE cit SET Paid = 'True'
FROM tContractsInTransit cit
WHERE (SELECT CtrlNo, SUM(Amt)/COUNT(DISTINCT CtrlNo)
FROM tContractsInTransit
GROUP BY CtrlNo) = 0

但收到此错误..

  

Msg 116,Level 16,State 1,Line 5
  未引入子查询时,只能在选择列表中指定一个表达式   存在。

这将是我用来选择尚未付清的记录的查询。

SELECT 
    [CtrlNo]
    ,[DealNoCat]
    ,[RefNo]
    ,[tCustomer].[CustomerName]
    ,[tBank].BankName
    ,[tFIManagers].[FIName]
    ,[Amt]
    ,[Days]
    ,[DaysOut]
FROM 
    [tContractsInTransit]
INNER JOIN 
    tFIManagers ON tFIManagers.FIManagerID = tContractsInTransit.FIManagerID
INNER JOIN 
    tBank ON tBank.BankID = tContractsInTransit.BankID
INNER JOIN 
    tCustomer ON tCustomer.CustomerID = tContractsInTransit.CustomerID
WHERE 
    PFX = @PFX
    AND Paid = 'false'
GROUP BY 
    [CtrlNo]
    ,[DealNoCat]
    ,[RefNo]
    ,[tCustomer].[CustomerName]
    ,[tBank].BankName
    ,[tFIManagers].[FIName]
    ,[Amt]
    ,[Days]
    ,[DaysOut]

我尝试删除' WHERE付费=' false'并将上面的选择语句替换为Amt int ..

 SUM(Amt)/COUNT(DISTINCT CtrlNo) AS Amt

但这会返回所有内容。

非常感谢任何想法!

2 个答案:

答案 0 :(得分:1)

使用HAVING子句,它等同于WHERE子句,但是在GROUP BY之外应用:

SELECT CtrlNo, SUM(Amt)/COUNT(DISTINCT CtrlNo)
FROM tContractsInTransit
GROUP BY CtrlNo
HAVING SUM(Amt)/COUNT(DISTINCT CtrlNo) = 0

答案 1 :(得分:0)

我找到了解决方案并且我发布了以防万一有人偶然发现这个问题。解决方案非常简单......

UPDATE tContractsInTransit
SET Paid = 'true'
FROM
tContractsInTransit cit
INNER JOIN
(SELECT CtrlNo
,SUM(Amt)/COUNT(DISTINCT CtrlNo) AS Tot
 FROM tContractsInTransit
    GROUP BY CtrlNo 
   HAVING SUM(Amt)/COUNT(DISTINCT CtrlNo) = 0) t
   ON cit.CtrlNo = t.CtrlNo

这会更新返回全部0结果的付费列。感谢Dan提出的有条款建议。