MySQL 查询:对另一列具有不同的列值求和
MySQL query: sum column values with distinct for another column
我正在尝试构建 MySQL 具有多个连接的查询以及连接值的总和。有3个table:customer、account和deposit。帐户和存款正在通过他们的 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 的解决方法。但真正的问题是求和"first deposits made by customers"。在对结果进行分组之前,我们可能会看到类似:
... 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".
恐怕这里的一个限制是,我不能使用 "left join(SELECT ... FROM deposit) as deposit",因为从存款 table 获取所有存款行时会占用大量内存。
我在这里看到了一个有趣的答案Sum values from one column if Index column is distinct?
但它适用于 MSSQL。
所以问题是:有没有一种方法可以在不使用 JOIN(SELECT) 的情况下对所有第一笔存款求和,或者也许有一种方法可以使用 JOIN(SELECT) 但使用一些内存经济技巧?
更新。
我们也可以使用 deposit.account_id 与帐户 table.
相关联
此查询将为您提供第一笔存款的 customer_id
和 amount
,无需使用子查询。
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
我正在尝试构建 MySQL 具有多个连接的查询以及连接值的总和。有3个table:customer、account和deposit。帐户和存款正在通过他们的 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 的解决方法。但真正的问题是求和"first deposits made by customers"。在对结果进行分组之前,我们可能会看到类似:
... 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".
恐怕这里的一个限制是,我不能使用 "left join(SELECT ... FROM deposit) as deposit",因为从存款 table 获取所有存款行时会占用大量内存。
我在这里看到了一个有趣的答案Sum values from one column if Index column is distinct? 但它适用于 MSSQL。
所以问题是:有没有一种方法可以在不使用 JOIN(SELECT) 的情况下对所有第一笔存款求和,或者也许有一种方法可以使用 JOIN(SELECT) 但使用一些内存经济技巧?
更新。 我们也可以使用 deposit.account_id 与帐户 table.
相关联此查询将为您提供第一笔存款的 customer_id
和 amount
,无需使用子查询。
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