用于从表中获取统计信息的SQL查询解决方案

时间:2018-07-26 10:35:02

标签: sql postgresql

我一直在尝试从表中获取统计信息。在下面,我试图绘制我的表结构: enter image description here

在上面,我有我的 Transaction 表,其中记录了每个用户 Profile(profile_id)的每笔交易。同时,我记录了交易创建日期 pub_date transaction_type (类型选项显示在圆圈中)和交易金额。创建交易后,我会为每个交易提供 Bonus (奖励),并使用适当的 Profile(profile_id)

因此,我想从日期范围内的上述表中获取统计信息。更精确地:

    WITHDRAW WITHDRAW_MANUAL transaction_type 的日期范围内,每个配置文件交易的
  1. 总交易金额总金额 >。
  2. DEPOSIT DEPOSIT_MANUAL transaction_type 的日期范围内,每个配置文件交易的
  3. 总交易总金额 >。
  4. 在日期范围内,每个配置文件交易的
  5. 总奖金总金额

视觉上,我想要这个结果。 enter image description here

这里选择的日期范围是指,我将为查询提供 startDate endDate 期间

我可以解决 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_id profile_id

P.S。我的表在PostGreSQL中。

1 个答案:

答案 0 :(得分:1)

子查询中是否只需要另一个#!/bin/bash logFolder="/dstDir/`date '+%Y-%m-%d/%H-%M'`" tempLogFolder="sourceDir" if [ -z "$(ls -A $tempLogFolder | grep *.log)" ]; then mkdir -p $logFolder mv $tempLogFolder/*.log $logFolder/ fi

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') ) 上的过滤器是否必要。