2016-10-05 56 views
0
SELECT deposit.numberSuccessfulDeposits, count(distinct userid) 
FROM deposit WHERE deposit.asOfDate between '2016-04-01 00:00:00' and '2016-04-03 23:59:59' 
AND deposit.licenseeId = 1306 
GROUP BY deposit.numberSuccessfulDeposits 

样本输出集团通过总结变量

numberSuccessfulDeposits  count(distinct userid) 
0 228 
1 878 
2 90 
3 37 
4 17 

然而,如果Bob在周二做出周一1个存3个存款,那么这将计入这两个“1”和“3”号的成功存款。

numberSuccessfulDeposits  count(distinct userid) 
0 ## 
1 1 
2 ## 
3 1 
4 ## 

理想的情况下,它应该只对 “4”

numberSuccessfulDeposits  count(distinct userid) 
0 ## 
1 ## 
2 ## 
3 ## 
4 1 

思考算什么?

回答

0

计算子查询中的每用户总和,然后计算主查询中的总计数。

SELECT totalDeposits, COUNT(*) 
FROM (SELECT userid, SUM(numberOfSuccessfulDeposits) AS totalDeposits 
     FROM deposit 
     WHERE deposit.asOfDate between '2016-04-01 00:00:00' and '2016-04-03 23:59:59' 
     AND deposit.licenseeId = 1306 
     GROUP BY userid) AS subquery 
GROUP BY totalDeposits 
+0

确定。卡米尔G.和巴尔玛的建议都奏效。现在,我如何将3个以上的存款组合为3+类别? – eddd83

1

将分组更改为基于用户,并对所有存款进行求和。再算上用户对这些存款的总和每个:

SELECT 
    numberSuccessfulDeposits, 
    COUNT(userid) AS users_count 
FROM (
    SELECT 
    sum(numberSuccessfulDeposits) AS numberSuccessfulDeposits, 
    userid 
    FROM deposit 
    WHERE asOfDate between '2016-04-01 00:00:00' and '2016-04-03 23:59:59' 
    AND licenseeId = 1306 
    GROUP BY userid 
) t 
GROUP BY numberSuccessfulDeposits 

编辑:分组deposints为0,1,2,3 +类看起来像:

SELECT 
    numberSuccessfulDeposits, 
    COUNT(userid) AS user_count 
FROM (
    SELECT 
    CASE WHEN numberSuccessfulDeposits >= 3 THEN '3+' ELSE numberSuccessfulDeposits::TEXT END AS numberSuccessfulDeposits, 
    userid 
    FROM (
    SELECT 
     sum(numberSuccessfulDeposits) AS numberSuccessfulDeposits, 
     userid 
    FROM deposit 
    WHERE asOfDate between '2016-04-01 00:00:00' and '2016-04-03 23:59:59' 
     AND licenseeId = 1306 
    GROUP BY userid 
    ) t 
) f 
GROUP BY numberSuccessfulDeposits 
+0

我不认为'DISTINCT'可以和'SUM'一起使用,只能和'COUNT'一起使用。即使可以,也是不对的。如果鲍勃星期一和星期三1笔存款,这只会计为1笔存款,而不是2。 – Barmar

+0

是的,它可以与'SUM'一起使用。为什么不?后半部分 - 我忘记了数据列,所以你说得对,我已经把它删除了,谢谢。 –

+0

我以为这是'COUNT'的一个特殊功能,但我只是查了一下手册,你说得对 - 它也适用于'AVG','MAX','MIN'等。我不确定*为什么*你想总结/平均只有不同的值,而'MAX'和'MIN'我不明白它是如何产生影响的。 – Barmar