如何在PostgreSQL中按天数和数量分组数据? (< 30,31-60,61-90,91 +)

时间:2016-10-07 14:04:44

标签: sql database postgresql graph

我是PostgreSQL的新手并且一般都在编写SQL语句,所以我正在寻求一些帮助!

我的所有数据都在一个表(帐户)上,我需要提取一个美元值(recovery_amount),两个日期(appeal_date和recovery_date),最后根据appeal_date和recovery_date的差异对数据进行分组随着日子的成熟,看到总的recovery_amount。

类似(recovery_date - appeal_date)的天数= recovery_amount总计< 30天,recovery_amount总计31-60天,recovery_amount总计61-90天,recovery_amount总计超过90天。

我正在尝试这样的陈述:

SELECT recovery_amount AS "Total"
CASE
  when (appeal_date - payment_date) >= 90 then 90
  when (appeal_date - payment_date) >= 60 then 60
  when (appeal_date - payment_date) >= 30 then 30
  else 0
END GROUP
FROM accounts
GROUP BY "Total"

最终目标是在条形图上使用此数据(如果这有助于您可视化推理。)

这显然已经过时了,因为我一直在尝试很多变化而无济于事。

你们/ gals给予的任何帮助都非常感谢!提前谢谢!

4 个答案:

答案 0 :(得分:0)

不是那么远......

SELECT  
sum(recoveryTotal) as TotalAmount, --if you want the overall total
sum (case when (appeal_date - payment_date) >= 90 then recoveryTotal else 0 end) as total90,
sum (case when (appeal_date - payment_date) >= 60 then recoveryTotal else 0 end)as total60,
sum (case when (appeal_date - payment_date) >= 30 then recoveryTotyl else 0 end) as total30
FROM accounts

答案 1 :(得分:0)

如果您想将数据保存在3列中。

SELECT count(*) NoOfAccts, sum(recovery_amount) AS "GroupTotal"
CASE
  when (appeal_date - payment_date) >= 90 then 90
  when (appeal_date - payment_date) >= 60 then 60
  when (appeal_date - payment_date) >= 30 then 30
  else 0
END GROUP
FROM accounts
GROUP BY CASE
  when (appeal_date - payment_date) >= 90 then 90
  when (appeal_date - payment_date) >= 60 then 60
  when (appeal_date - payment_date) >= 30 then 30
  else 0
END 

会导致类似

的内容
NoOfAccts   GroupTotal    Group
22          3754.48       90
96          24834.83      60
123         38348.48      30
9999        1824389.83    0

答案 2 :(得分:0)

对此的一个解决方案是条件聚合(参见Raphaël的回答)。

如果您不需要将其作为单独的列,那么如果使用范围列表,则可以使其更加动态(=更易于维护)。当您计划将其用于报告时,那应该没问题

with limits (range) as (
  values 
    (int4range(0,30,'[)')),
    (int4range(30,60,'[)')),
    (int4range(60,90,'[)')),
    (int4range(90,null,'[)'))
)
select l.range as day_range,
       sum(coalesce(recovery_amount,0)) as total
from limits l
  left join accounts ac
    on (ac.appeal_date - ac.payment_date) <@ l.range
group by range
order by range;

示例:http://rextester.com/UYDOV15732

现在,如果您想要一个新范围,只需将其添加到范围列表中,而无需更改实际查询。您甚至可以根据自动调整到表格中数据的数据自动生成大小相等的范围。

答案 3 :(得分:0)

应该能够使用DATE_PART查找天数差异http://www.sqlines.com/postgresql/how-to/datediff

因此,如果我正确理解您正在尝试将总恢复金额除以日期差异,请执行以下操作:

    SELECT CASE DATE_PART('day', appeal_date - payment_date)
            WHEN <= 30 THEN '<=30'
            WHEN BETWEEN 31 and 60 THEN '31-60'
            WHEN BETWEEN 61 and 90 THEN '61-90'
            WHEN > 90 THEN '>90'
            ELSE 0
        END as 'DateRange',
        SUM(recovery_amount) AS "Total"
    FROM accounts
    GROUP BY CASE DATE_PART('day', appeal_date - payment_date)
            WHEN <= 30 THEN '<=30'
            WHEN BETWEEN 31 and 60 THEN '31-60'
            WHEN BETWEEN 61 and 90 THEN '61-90'
            WHEN > 90 THEN '>90'
            ELSE 0
        END