Postgres:根据设定的目标调整每月计算

时间:2016-05-17 10:11:48

标签: sql postgresql

以下是我的表格:

 practice_id |   practice_name   | practice_location | practice_monthly_revenue | practice_no_of_patients |        date
-------------+-------------------+-------------------+--------------------------+-------------------------+---------------------
           6 | Practice Clinic 1 | Location1         |                    10000 |                       8 | 2016-01-12 00:00:00
           7 | Practice Clinic 1 | Location1         |                    12000 |                      10 | 2016-02-12 00:00:00
           8 | Practice Clinic 1 | Location1         |                     8000 |                       4 | 2016-03-12 00:00:00
           9 | Practice Clinic 1 | Location1         |                    15000 |                      10 | 2016-04-12 00:00:00
          10 | Practice Clinic 1 | Location1         |                     7000 |                       3 | 2016-05-12 00:00:00
          11 | Practice Clinic 2 | Location2         |                    15000 |                      12 | 2016-01-13 00:00:00
          12 | Practice Clinic 2 | Location2         |                     9000 |                       8 | 2016-02-13 00:00:00
          13 | Practice Clinic 2 | Location2         |                     5000 |                       2 | 2016-03-03 00:00:00
          14 | Practice Clinic 2 | Location2         |                    12000 |                       9 | 2016-04-13 00:00:00
----------------------------------------------------------------------------------------------------------------------------------

我在查询下方点击以获得每月收入与每月目标: -

select [date:month], SUM(practice_monthly_revenue) as Monthly_Revenue,  100000/12 as Goals
from practice_info
where practice_name IN ('Practice Clinic 1')
group by [date:month], practice_name
ORDER BY [date:month] ASC

“月度收入”指的是每月的确切收入,而“目标”是预计会产生的确切收入。

现在我遇到了编写SQL查询以在下个月调整目标的问题,如果没有达到目标的话。 例如。如果在3月份产生的收入低于8k这是每月目标,那么目标的剩余金额应该在下个月的目标中进行调整。

使用sql查询是否可以实现这一点,或者我必须为它编写一个sql过程?

编辑: - 我忘了添加db属于postgres。

1 个答案:

答案 0 :(得分:0)

目标可以算作

with recursive goals(mon, val, rev) as
(select min([pinf.date:month]) as mon /* Starting month */, 8000 as val /* Starting goal value */, pinf.practice_monthly_revenue as rev
    from practice_info pinf
    where pinf.practice_name IN ('Practice Clinic 1')
union all
select goals.mon + 1 as mon, 8000 + greatest(0, goals.val - goals.rev) as val, pinf.practice_monthly_revenue as rev
    from practice_info pinf, goals
    where goals.mon + 1  = [pinf.date:month]
      and pinf.practice_name IN ('Practice Clinic 1')
)
select * from goals;

只需将其与您的查询集成即可比较目标和收入。它可能不是你想要的,但我相信你会得到主要观点。