首页 > 解决方案 > 从我的表中获取统计信息的 SQL 查询解决方案

问题描述

我一直在尝试从我的表中获取统计信息。在下文中,我试图绘制我的表结构: 在此处输入图像描述

在上面,我有我的Transaction表,其中记录了每个用户Profile(profile_id)的每笔交易。此外,我记录了交易创建日期pub_datetransaction_type(类型选项显示在圆圈中)和 transaction amount。创建交易后,我使用适当的Profile(profile_id)为每笔交易提供奖励

所以,我想从上面的表格中获取日期范围内的统计信息。更确切地说:

  1. 交易类型为WITHDRAWWITHDRAW_MANUAL的日期范围内每个配置文件交易的总交易金额
  2. 交易类型为DEPOSITDEPOSIT_MANUAL的日期范围内每个配置文件交易的总交易金额
  3. 日期范围内每个配置文件交易的总奖金总额。

在视觉上,我想要这个结果。 在此处输入图像描述

这里选择的日期范围意味着,我会给查询提供startDateendDate时间段

我可以设法解决1.2 .. 但是,我找不到方法(对于3.)在日期范围内对每个配置文件的BONUS金额求和。我的解决方案如下:

 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_idprofile_id

PS 我的表在 PostGreSQL 中。

标签: sqlpostgresql

解决方案


你只需要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有没有必要。


推荐阅读