我一直在尝试从我的表中获取统计信息。在下文中,我尝试绘制我的表结构:
在上面,我有我的Transaction 表,其中记录了每个用户Profile(profile_id) 的每笔交易。此外,我记录交易创建日期pub_date、transaction_type(类型选项显示在圆圈中)和交易金额。创建交易后,我会通过适当的Profile(profile_id) 为每笔交易提供Bonus。
所以,我想在日期范围内从上面的表格中获取统计信息。更准确地说:
- transaction_type为WITHDRAW 和WITHDRAW_MANUAL 的日期范围内每个配置文件交易的总交易总金额>.
- transaction_type为DEPOSIT 和DEPOSIT_MANUAL 的日期范围内每个个人资料交易的总交易总金额>.
- 日期范围内每笔个人资料交易的总奖金总金额。
这里选择的日期范围意味着,我将给查询提供startDate 和endDate 时间段
我可以设法解决1. 和2.。但是,我找不到方法(对于 3.)在日期范围内对每个配置文件的 BONUS 金额进行 SUM。我的解决方案如下:
SELECT mtd.profile_id, sum(mtd.amount) AS summa_deposit,
(
SELECT sum(mtw.amount) AS summa_withdraw
FROM public.main_transaction AS mtw
WHERE mtw.profile_id=mtd.profile_id AND mtw.pub_date>='2017-01-01' AND mtw.pub_date<='2017-10-01' AND mtw.transaction_type IN ('WITHDRAW','WITHDRAW_MANUAL')
)
FROM public.main_transaction AS mtd
WHERE mtd.pub_date>='2017-01-01' AND mtd.pub_date<='2017-10-01' AND mtd.transaction_type IN ('DEPOSIT','DEPOSIT_MANUAL')
GROUP BY mtd.profile_id
ORDER BY mtd.profile_id;
获取每个个人资料奖金的总额在这里不是问题。问题是要在日期范围 内获得这些金额。因为,我没有将日期记录到我的 Bonus 表中。我只有我的 transaction_id 和 profile_id
附言我的表在 PostGreSQL 中。
最佳答案
您是否只需要在子查询中加入另一个join
?
(SELECT SUM(b.amount) AS summa_bonus
FROM public.bonus b JOIN
public.main_transaction mtw
ON b.transaction_id = mtw.id
WHERE mtw.profile_id = mtd.profile_id AND
mtw.pub_date >= '2017-01-01' AND
mtw.pub_date <= '2017-10-01' AND
mtw.transaction_type IN ('WITHDRAW', 'WITHDRAW_MANUAL')
)
我不知道 transaction_type
上的过滤器是否有必要。
关于用于从我的表中获取统计信息的 SQL 查询解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51536773/