2012-03-18 42 views
1

我想做一个SQL查询,从不同的表中减去两个值,以确定每个客户端的剩余余额。这是我的SQL查询。但我得到一个错误1241(操作数应该包含1列)。我已经放了一个别名,“平衡”。在SQL中的错误1241

SELECT tblClientInfo.ClientID, 
    (SELECT tblLoanPayment.ClientID, 
    SUM(tblLoanPayment.AmountPaid) FROM tblLoanPayment) - 
    (SELECT tblLedger.ClientID, tblLedger.LoanAmount from tblLedger) AS BALANCE 
FROM tblClientInfo, tblLedger, tblLoanPayment 
WHERE tblClientInfo.ClientID = 1 

你能帮帮我吗?提前致谢。

+0

**什么**数据库系统,以及哪个版本? ** SQL **只是结构化查询语言(Structured Query Language) - 许多数据库系统使用的语言 - SQL是** NOT **数据库产品......类似这样的东西通常是供应商特定的 - 所以我们真的需要知道什么您正在使用的数据库系统.... – 2012-03-18 09:07:32

+0

另外:您应该在所有这些表之间定义** JOIN条件**!否则,你最终会得到一个表中所有行的笛卡尔积,第二个(和第三个表)中的所有行 - 方式太多的行.... – 2012-03-18 09:10:52

回答

3

您正在选择两列!

(Select tblLoanPayment.ClientID, sum(tblLoanPayment.AmountPaid) 

您必须选择一列只有使用数学运算符!

SELECT 
    (SELECT SUM(t.AmountPaid) 
    FROM tblLoanPayment t 
    WHERE t.ClientID = 1) - 
    (SELECT t.LoanAmount 
    from tblLedger 
    WHERE t.ClientID = 1) 
FROM dual; 
+0

谢谢!我现在得到了... – zairahCS 2012-03-18 09:26:00

+0

我可以问另一件事吗?我将这个查询的答案放在我的jtable的一列中,列名是什么?> – zairahCS 2012-03-18 09:35:26

+1

@zairahCS。你需要给它一个别名。 – gdoron 2012-03-18 09:43:21

0

你的第二个子选择是给出两列,-只对单个值进行操作。

如果没有付款,您的子选项也可能会产生奇怪的结果;如果您将其重写为JOIN,我发现查询更易于阅读。

SELECT ci.ClientID, ledger.LoanAmount - COALESCE(SUM(AmountPaid), 0) Remaining 
FROM tblClientInfo ci 
JOIN tblLedger ledger ON ci.ClientID=ledger.ClientId 
LEFT JOIN tblLoanPayment lp ON ci.ClientID=lp.ClientId 
GROUP BY ci.ClientID, ledger.loanAmount 

演示here