Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.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
Mysql 为什么sql在结果中给出不正确的和?_Mysql_Sql_Left Join - Fatal编程技术网

Mysql 为什么sql在结果中给出不正确的和?

Mysql 为什么sql在结果中给出不正确的和?,mysql,sql,left-join,Mysql,Sql,Left Join,表余额中的行: 行金额的类型为十进制10,1 我们正在选择: SELECT u.UserID as UserID, (ifnull(b.BalanceDebit,0) - ifnull(bc.BalanceCredit, 0)) as Balance, ifnull(bc.BalanceCredit, 0) as BalanceCredit FROM

余额中的行

金额
的类型为十进制10,1

我们正在选择:

SELECT
                u.UserID as UserID,

                (ifnull(b.BalanceDebit,0) - ifnull(bc.BalanceCredit, 0)) as Balance,
                ifnull(bc.BalanceCredit, 0) as BalanceCredit

            FROM 
                Users as u
            LEFT JOIN 
                    (
                        SELECT 
                            UserID,
                            SUM(Amount) as BalanceDebit
                        FROM
                            Balance
                        WHERE 
                            Operation='debit' AND StatusPay = 'success'
                        GROUP BY 
                            UserID
                    ) as b ON u.UserID = u.UserID
            LEFT JOIN 
                    (
                        SELECT 
                            UserID, 
                            SUM(Amount) as BalanceCredit
                        FROM
                            Balance
                        WHERE 
                            Operation='credit' AND StatusPay = 'success'
                        GROUP BY 
                            UserID
                    ) as bc ON bc.UserID = u.UserID

            WHERE 
                u.UserID != '12'
选择后,我们将看到下一行:

但结果并不平衡。结果显示,所有用户都平衡了10.0,但只有一个用户(UsersID=40)平衡了10.0


请告诉我sql查询中的错误在哪里?如何右键选择sum?

您的问题是您的第一个左外连接:

ON u.UserID = u.UserID
应该是

ON u.UserID = b.UserID
另外,如果你想找到余额,我想你会把所有的贷项都记下来,然后减去所有的借项。因此,与此相反:

ifnull(b.BalanceDebit,0) - ifnull(bc.BalanceCredit, 0)
不应该是这样吗

ifnull(b.BalanceCredit,0) - ifnull(bc.BalanceDebit, 0)

两个左连接可以组合成一个用例(并修复坏连接条件):


Bill Gregg指出的连接条件是导致结果关闭的主要原因。可以重写查询,以避免必须两次连接到Balance:

SELECT u.UserID
, COALESCE(b.CalculatedBalance, 0)
, COALESCE(b.BalanceCredit, 0)
FROM Users AS u
LEFT JOIN
  (SELECT UserID,
    SUM(CASE Operation
      WHEN 'debit' THEN Amount*-1
      WHEN 'credit' THEN Amount
    END) AS CalculatedBalance,
    SUM(CASE Operation
      WHEN 'credit' THEN Amount
    END) AS BalanceCredit
  FROM Balance
  WHERE StatusPay  = 'success'
  GROUP BY UserID
  ) AS b
ON u.UserID = b.UserID
WHERE u.UserID != '12'

不需要子查询,可以实现如下相同的结果:

SELECT
    u.UserID,
    SUM(CASE WHEN b.operation = 'debit' THEN b.operation ELSE 0 END) balance_debit,
    SUM(CASE WHEN b.operation = 'credit' THEN b.operation ELSE 0 END) balance_credit,
    SUM(CASE WHEN b.operation = 'debit' THEN b.operation ELSE 0 END) -
        SUM(CASE WHEN b.operation = 'credit' THEN b.operation ELSE 0 END) balance
FROM users u
LEFT JOIN
    balance b
    ON u.UserID = b.UserID AND b.StatusPay = 'success'
WHERE u.UserID <> 12
GROUP BY u.USERID
选择
u、 用户ID,
总和(当b.操作='借方'然后b.操作0结束时的情况)余额\借方,
总和(当b.操作='贷方'时,则b.操作0结束)余额_贷方,
总和(当b.operation='debit'然后b.operation ELSE 0结束时)-
总和(当b.操作='信用'然后b.操作0结束时的情况)余额
来自用户u
左连接
余额b
在u.UserID=b.UserID和b.StatusPay='success'
其中u.UserID 12
按u.USERID分组
oh抱歉和感谢)ifnull(b.BalanceDebit,0)-ifnull(b.BalanceCredit,0)-这不需要编辑。余额=借方-贷方;
SELECT
    u.UserID,
    SUM(CASE WHEN b.operation = 'debit' THEN b.operation ELSE 0 END) balance_debit,
    SUM(CASE WHEN b.operation = 'credit' THEN b.operation ELSE 0 END) balance_credit,
    SUM(CASE WHEN b.operation = 'debit' THEN b.operation ELSE 0 END) -
        SUM(CASE WHEN b.operation = 'credit' THEN b.operation ELSE 0 END) balance
FROM users u
LEFT JOIN
    balance b
    ON u.UserID = b.UserID AND b.StatusPay = 'success'
WHERE u.UserID <> 12
GROUP BY u.USERID