MySQL查询:将列值与另一列的不同列相加

时间:2015-04-17 08:09:48

标签: mysql join sum distinct

我正在尝试使用多个连接构建MySQL查询,其中包含一些连接值。有3个表:客户,账户和存款。帐户和存款通过其customer_id字段加入客户。在查询结束时,所有客户都按其group_id进行分组:

SELECT customer.*,
COUNT(DISTINCT account.id) as account_count,
SUM(deposit.amount)/(COUNT(deposit.id)/COUNT(DISTINCT deposit.id)) as deposit_sum,
SUM(???) as deposit_first_sum
FROM customer
    LEFT JOIN account ON account.customer_id = customer.id 
    LEFT JOIN deposit ON deposit.customer_id = customer.id 
GROUP BY customer.group_id

问题是:联合行是重复的,而我必须进行一些分析:汇总所有存款金额 - 您可以在这里查看我的解决方法,以获取deposit_sum。但真正的问题是总结“客户首次存款”。在对结果进行分组之前,我们可能会发现有类似的内容:

... deposit.id deposit.customer_id  deposit.amount
...     1               1               10
...     2               1               20
...     3               2               15
...     4               2               30

所以我需要的是只为每个customer_id(10 + 15)加上第一笔金额,即“deposit_first_sum”。

这里的一个限制是我害怕,我不能使用“左连接(SELECT ... FROM deposit)作为存款”,因为从存款表中获取所有存款行需要大量内存。

我在这里看到一个有趣的答案Sum values from one column if Index column is distinct? 但它适用于MSSQL。

所以问题是:有没有办法在不使用JOIN(SELECT)的情况下对所有首次存款求和,或者有一种方法可以使用JOIN(SELECT)但是有一些记忆经济技巧?

更新。 我们也可以使用与帐户表相关的deposit.account_id。

1 个答案:

答案 0 :(得分:0)

此查询将为您首次存款提供customer_idamount,而不使用子查询。

select d1.customer_id, d1.amount
  from deposit d1
    left join deposit d2
      on d1.customer_id = d2.customer_id and d1.id > d2.id
  where d2.id is null;

显然你也可以获得sum

select sum(d1.amount) total_first_deposit
  from deposit d1
    left join deposit d2
      on d1.customer_id = d2.customer_id and d1.id > d2.id
  where d2.id is null;

你也可以得到总和,以及这样的第一笔存款的总和:

select sum(d3.amount) total_deposit, sum(case when d3.id = d1.id then d3.amount end) total_first_deposit
  from deposit d1
    left join deposit d2
      on d1.customer_id = d2.customer_id and d1.id > d2.id
    inner join deposit d3
      on d1.customer_id = d3.customer_id and d2.id is null