在SQL中求和值不起作用
我有一个表[Transaction],用于存储使用金钱玩双陆棋的玩家的交易值。房子可以在游戏中赊购,然后再付款,也可以在手上借记现金。有四种类型的交易:借记、贷记和“贷记结算”——客户偿还部分或全部欠款,以及“借记结算”——如果房子欠玩家钱,由房子付款。我想做的是找到平衡点。我已经尝试了很多sql语句,但是我总是缺少一些东西,并且平衡不正确 一个简单的场景是:客户走进来,以300英镑的信用购买。他兑现了100英镑,因此欠这所房子200英镑。第二天他来了,以100英镑的价格买进,所以现在他欠了300英镑,最后兑现了1000英镑。房子付给他500英镑,但还欠他200英镑。房屋向客户支付200英镑,因此将其存储为“借记结算” 以下是我到目前为止得到的结果,但结果并不总是正确的:在SQL中求和值不起作用,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我有一个表[Transaction],用于存储使用金钱玩双陆棋的玩家的交易值。房子可以在游戏中赊购,然后再付款,也可以在手上借记现金。有四种类型的交易:借记、贷记和“贷记结算”——客户偿还部分或全部欠款,以及“借记结算”——如果房子欠玩家钱,由房子付款。我想做的是找到平衡点。我已经尝试了很多sql语句,但是我总是缺少一些东西,并且平衡不正确 一个简单的场景是:客户走进来,以300英镑的信用购买。他兑现了100英镑,因此欠这所房子200英镑。第二天他来了,以100英镑的价格买进,所以现在他欠了30
SELECT SUM(Cashout) - ((SELECT COALESCE (SUM(Paid), 0) AS Expr1
FROM [Transaction]
WHERE (Type = 'Credit Settlement')) + SUM(Buyin) +
(SELECT COALESCE (SUM(Paid), 0) AS Expr1
FROM [Transaction] AS Transaction_3
WHERE (Type = 'Debit Settlement') AND (Paid IS NOT NULL))) AS OutstandingDebit
FROM [Transaction] AS Transaction_1
WHERE (Type <> 'Debit Settlement') AND (Cashout >= 0) AND (CustomerID = 132)
试试这个。我相信它是有效的。余额应该是-200。 我相信,虽然有人可以编辑和优化它,或使它看起来更优雅@贾斯汀,@Tim Rogers,@nec tso
SELECT (
(SELECT coalesce(SUM(cashout),0)-
((select coalesce(sum(Buyin),0) from [Transaction] where TYPE='Credit' and CustomerID=132)
+ (select coalesce(sum(Paid),0) from [Transaction] where TYPE='Credit' and CustomerID=132))
FROM [transaction]
WHERE TYPE='Credit'
AND CustomerID=132
)
-------------------
+
(
(SELECT coalesce(SUM(cashout),0)
- (select coalesce(sum(Paid),0) from [Transaction] where TYPE='Debit' AND Cashout>buyin and CustomerID=132)
+ (select coalesce(sum(Cashout),0)- (select coalesce(sum(PAID),0) from [Transaction] where TYPE='Debit' AND Cashout<buyin and CustomerID=132)
from [Transaction] where TYPE='Debit' AND Cashout<Buyin and CustomerID=132)
+ (select coalesce(sum(Cashout),0)- (select coalesce(sum(PAID),0) from [Transaction] where TYPE='Debit' AND Cashout=buyin and CustomerID=132)
from [Transaction] where TYPE='Debit' AND Cashout=Buyin and CustomerID=132)
FROM [Transaction]
WHERE CustomerID=132
AND TYPE='Debit'
AND Cashout>buyin )
)
--------------
-
(
select coalesce(sum(Paid),0)
from [Transaction]
where type='Debit Settlement'
AND CustomerID =132
)
--------------
+
(
select coalesce(sum(Paid),0)
from [Transaction]
where type='Credit Settlement'
AND CustomerID =132
)
);
该图片所需的结果是什么?CustomerID在哪里?更重要的是,为什么它不在两个子查询中引用?@Tim Rogers表上有一个CustomerID列,但它不影响select语句的操作。“你们可以假设是132英镑。”贾斯汀·特兰斯德:190名顾客用100英镑赊购,兑现了50英镑,所以他欠了50英镑。但是我们付了他50英镑,所以他欠了100英镑。TransID:197他以100美元买进,却输了。他还欠100英镑。他还了我们100英镑,所以余额是0。TransID 199。客户错误地向我们支付了50英镑作为Cr结算,所以我们欠他+50英镑。TransID:200他买了200张信用卡,赢了250张450-200张,但我们忘了这是信用卡交易,所以我们多付给他200张。他欠我们200英镑,我们从TransID 199欠他50英镑,他欠我们150英镑。TransID:201他付了他欠我们50英镑的一部分,所以他欠我们100英镑。所以我的观点是,你的两个子查询将对表中某一类型的所有内容求和。那不可能是对的。