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