Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.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 选择两个不同表的总和_Mysql_Sql - Fatal编程技术网

Mysql 选择两个不同表的总和

Mysql 选择两个不同表的总和,mysql,sql,Mysql,Sql,我有一个订单表,包括以下内容: id order_total delivery_cost customer_id 我还有一个事务表,其中包含: id amount customer_id status 我想做的是 SELECT SUM(order_total + delivery_cost) FROM orders WHERE customer_id = '1' 然后 然后用数据减去订单总额中的总额 我尝试过使用联接进行不同的查询,但我就是想不通,例如: SELECT SUM(Orders

我有一个订单表,包括以下内容:

id
order_total
delivery_cost
customer_id
我还有一个事务表,其中包含:

id
amount
customer_id
status
我想做的是

SELECT SUM(order_total + delivery_cost) FROM orders WHERE customer_id = '1'
然后

然后用数据减去订单总额中的总额

我尝试过使用联接进行不同的查询,但我就是想不通,例如:

SELECT SUM(OrdersTotal - TransactionTotal) as AccountBalance

FROM (
SELECT SUM(`order_total` + `delivery_cost`) FROM `orders` as OrdersTotal 
UNION ALL 
SELECT SUM(`amount`) FROM `transactions` WHERE `transaction_status` = 'Paid' as TransactionTotal
) 

但这根本不起作用。任何帮助都将不胜感激。

您只需在您的工会中列出所有查询和求和:

SELECT SUM(col) as AccountBalance
FROM (SELECT SUM(`order_total` + `delivery_cost`) as col FROM `orders` as OrdersTotal 
      UNION ALL 
      SELECT SUM(`amount`) FROM `transactions` WHERE `transaction_status` = 'Paid' as    TransactionTotal
     ) t;

使用联接尝试此查询:

SELECT
    SUM(o.order_total + o.delivery_cost) - SUM(t.amount) AS AccountBalance
FROM orders o
INNER JOIN transactions t
ON o.customer_id = t.customer_id AND o.customer_id = '1' AND t.transaction_status = 'Paid';

这会给你每个客户的账户余额吗

SELECT 
    ISNULL(o.customer_id, t.customer_id) AS customer_id
    OrdersTotal - TransactionTotal AS AccountBalance
FROM (
    SELECT 
        customer_id, 
        SUM(order_total + delivery_cost) AS OrdersTotal 
    FROM 
        orders 
    GROUP BY 
        customer_id) o
FULL OUTER JOIN (
    SELECT 
        customer_id, 
        SUM(amount) AS TransactionTotal 
    FROM 
        transactions 
    WHERE 
        transaction_status = 'Paid' 
    GROUP BY 
        customer_id) t
ON t.customer_id = o.customer_id

您可以合并查询结果并执行计算,请注意,不带group by的sum将生成一行,因此外部查询中的sum并不意味着只有一行,并且根据您的计算逻辑,union与之无关

SELECT t1.OrdersTotal - t2 .TransactionTotal AS AccountBalance
FROM (
SELECT SUM(order_total + delivery_cost) OrdersTotal ,customer_id 
 FROM orders 
 WHERE customer_id = '1'
) t1
JOIN (
SELECT SUM(amount) TransactionTotal ,customer_id
FROM transactions 
WHERE customer_id = '1' AND transaction_status = 'Paid'
) t2 USING(customer_id)

因为您只关心一个客户,所以只需将其作为两个不同的查询列出作为源

select
      charges.chg - paid.pay as Balance
   from
      ( SELECT SUM(order_total + delivery_cost) chg
           FROM orders 
           WHERE customer_id = '1' ) charges,
      ( SELECT SUM(amount)  pay
           FROM transactions 
           WHERE customer_id = '1' AND transaction_status = 'Paid' ) paid
现在,如果您想让所有客户都知道谁是优秀的,请将客户的ID添加到每个查询中,并应用group by,然后更改为LEFT JOIN,以便使用或获取所有订单

select
      charges.customer_id,
      charges.chg - coalesce( paid.pay, 0 ) as Balance
   from
      ( SELECT customer_id, SUM(order_total + delivery_cost) chg
           FROM orders 
           group by customer_id ) charges
         LEFT JOIN ( SELECT customer_id, SUM(amount)  pay
                        FROM transactions 
                        where transaction_status = 'Paid' 
                        group by customer_id ) paid
          on charges.customer_id = paid.customer_id

我认为如果您尝试使用内联视图,这将是最好的。在下面的代码块中,选中Group By子句,您可能需要根据在内部SELECT语句中选择的内容在组中添加更多字段。请尝试下面的代码:

SELECT
  SUM(Totals.OrdersTotal-Totals.TransactionTotal)
  FROM 
      (SELECT
           SUM(ord.order_total + ord.delivery_cost) AS OrdersTotal
           , SUM(trans.amount) AS TransactionTotal
           FROM orders ord
                INNER JOIN transactions trans
                     ON ord.customer_id = trans.customer_id
           WHERE
                ord.customer_id =1
                AND trans.transaction_status = 'Paid'
           GROUP BY
                ord.customer_id
      ) Totals;

这两个数据集实际上是独立的,但假设没有订单的客户不可能有交易,您可以使用左联接而不是全外部联接来获得结果-但是如果您只是联接基表,那么您很可能会从临时结果集中重复的一个表中获得值。这就是为什么当客户在每个表中都有一行以外的内容时,Joseph B的答案是错误的

SELECT ordered_value-IFNULL(paid_value,0) AS acct_balance
FROM
(
  SELECT customer_id, SUM(order_total + delivery_cost) AS ordered_value
  FROM orders 
  WHERE customer_id = '1'
  GROUP BY customer_id
) AS orders
LEFT JOIN 
(
  SELECT customer_id, SUM(amount) AS paid_value
  FROM transactions 
  WHERE customer_id = '1' 
  AND transaction_status = 'Paid'
  FROUP BY customer_id
) as payments
ON orders.customer_id = payments.customer_id
这里的“GROUP BY”和“ON”条款是多余的,因为您只关注一个客户,但对于多个客户是必需的


请注意,基于交易总额计算余额在技术上是正确的,它不能很好地扩展-对于大型系统,一个更好的解决方案虽然它打破了规范化规则,但它是维护一个统一的交易表和账户余额以及每个交易金额-或者使用检查点。

您是否缺少客户id='1'标准?有或没有它,它仍然会返回总数,如果没有,它会返回每个记录的总数。
SELECT ordered_value-IFNULL(paid_value,0) AS acct_balance
FROM
(
  SELECT customer_id, SUM(order_total + delivery_cost) AS ordered_value
  FROM orders 
  WHERE customer_id = '1'
  GROUP BY customer_id
) AS orders
LEFT JOIN 
(
  SELECT customer_id, SUM(amount) AS paid_value
  FROM transactions 
  WHERE customer_id = '1' 
  AND transaction_status = 'Paid'
  FROUP BY customer_id
) as payments
ON orders.customer_id = payments.customer_id