Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在SQL中求和值不起作用_Sql_Sql Server_Sql Server 2008 - Fatal编程技术网

在SQL中求和值不起作用

在SQL中求和值不起作用,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我有一个表[Transaction],用于存储使用金钱玩双陆棋的玩家的交易值。房子可以在游戏中赊购,然后再付款,也可以在手上借记现金。有四种类型的交易:借记、贷记和“贷记结算”——客户偿还部分或全部欠款,以及“借记结算”——如果房子欠玩家钱,由房子付款。我想做的是找到平衡点。我已经尝试了很多sql语句,但是我总是缺少一些东西,并且平衡不正确 一个简单的场景是:客户走进来,以300英镑的信用购买。他兑现了100英镑,因此欠这所房子200英镑。第二天他来了,以100英镑的价格买进,所以现在他欠了30

我有一个表[Transaction],用于存储使用金钱玩双陆棋的玩家的交易值。房子可以在游戏中赊购,然后再付款,也可以在手上借记现金。有四种类型的交易:借记、贷记和“贷记结算”——客户偿还部分或全部欠款,以及“借记结算”——如果房子欠玩家钱,由房子付款。我想做的是找到平衡点。我已经尝试了很多sql语句,但是我总是缺少一些东西,并且平衡不正确

一个简单的场景是:客户走进来,以300英镑的信用购买。他兑现了100英镑,因此欠这所房子200英镑。第二天他来了,以100英镑的价格买进,所以现在他欠了300英镑,最后兑现了1000英镑。房子付给他500英镑,但还欠他200英镑。房屋向客户支付200英镑,因此将其存储为“借记结算”

以下是我到目前为止得到的结果,但结果并不总是正确的:

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英镑。所以我的观点是,你的两个子查询将对表中某一类型的所有内容求和。那不可能是对的。