如何在mysql中为所有客户选择客户的最终余额

时间:2016-08-16 18:36:14

标签: mysql

我有3张桌子。

table_customers - customer_id, name
table_orders - order_id, customer_id, order_datetime
table_wallet - customer_id, amount, type  // type 1- credit, type 2- debit

我需要获得所有客户,他们的总余额以及他们的最后订单日期和订单ID。这是我的疑问。

SELECT 
C.customer_id, 
C.name, 
COALESCE( SUM(CASE WHEN type = 2 THEN -W.amount ELSE W.amount END), 0) AS value,
COALESCE( max( O.order_id  ) , '0' ) AS last_order_id, 
COALESCE( max( date( O.order_datetime ) ) , '0000-00-00' ) AS last_order_date
FROM 
table_customers as C 
LEFT JOIN 
table_wallet as W 
ON C.customer_id = W.customer_id 
LEFT JOIN
table_orders AS O
ON W.customer_id = O.customer_id
group by C.customer_id
ORDER BY C.customer_id

除客户的总价值外,一切都是正确的。从结果来看,它似乎被多次添加。

查询有什么问题?任何人都可以帮我吗?

1 个答案:

答案 0 :(得分:1)

这是table_customerstable_orders的多对多加入,这将使您的总和混乱。而是这样做:

SELECT C.customer_id
, C.name
, IFNULL((SELECT SUM(IF(W.type=2, -1*W.amount, W.amount))
    FROM table_wallet W 
    WHERE C.customer_id = W.customer_id),0) AS value
, IFNULL((SELECT MAX(DATE(O.order_id))
    FROM table_orders O 
    WHERE C.customer_id = O.customer_id),'0') AS last_order_id
, IFNULL((SELECT MAX(DATE(O.order_datetime))
    FROM table_orders O 
    WHERE C.customer_id = O.customer_id),'0000-00-00') AS last_order_date
FROM table_customers as C 
ORDER BY C.customer_id

这将为每个客户返回一行,然后子查询所需的字段。我已将IFNULL替换为COALESCE,因为我发现它更清晰,但这是一种偏好。