由于我不是最好的SQL,我遇到了一个场景,我必须根据他们的' CtrlNo'来排队。如果结果返回零,那么我不需要显示它们。
我能够对这些记录求和并显示这样的结果..
SELECT CtrlNo, SUM(Amt)/COUNT(DISTINCT CtrlNo)
FROM tContractsInTransit
GROUP BY CtrlNo
这将对不同的CtrlNo求和,结果就像这样..
但是,我需要根据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
但这会返回所有内容。
非常感谢任何想法!
答案 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提出的有条款建议。