CASE w / DATEADD多次调整到SUM列以进行未来的盈利预测

时间:2014-12-05 22:48:36

标签: mysql sum case dateadd

编辑:原帖如下,但有点长而且罗嗦。此编辑提供了一个简化的问题。

我多次尝试SUM 1列;根据我的发现,我的选项是CASE(SELECT)。我正在尝试基于日期范围的SUM,我无法弄清楚CASE是否允许这样做。

 table.number  |  table.date  
   2        2014/12/18
   2        2014/12/19
   3        2015/01/11
   3        2015/01/12
   7        2015/02/04
   7        2015/02/05

作为单独的查询,它看起来像这样:

SELECT SUM(number) as alpha FROM table WHERE date >= 2014/12/01 AND date<= DATE_ADD (2014/12/01, INTERVAL 4 WEEKS)
SELECT SUM(number) as beta FROM table WHERE date >= 2014/12/29 AND date<= DATE_ADD (2014/12/01, INTERVAL 4 WEEKS)
SELECT SUM(number) as gamma FROM table WHERE date >= 2014/01/19 AND date<= DATE_ADD (2014/12/01, INTERVAL 4 WEEKS)

寻找结果集

alpha   |   beta   | gamma
  2          6         14

ORIGINAL: 我正在尝试在当前预算期和2个未来期间的预算时间框架(4周)内返回SUM次付款。有些学生每4周付费一次,其他学生每12次付费。以下是我的表格中的相关字段:

client.name |   client.ppid |  client.last_payment
john            |   1       |   12/01/14
jack            |   2       |   11/26/14
jane            |   3       |    10/27/14       



pay_profile.id  | pay_profile.price | pay_profile.interval  (in weeks)
        1                   140                     4
        2                   399                     4
        3                   1                       12

pay_history.name    |   pay_history.date  | pay_history.amount 
john                |       12/02/14      |        140
jerry               |   more historical   |       data


budget.period_start |
        12/01/14

我认为最有效的方法是:

1.)将所有每4周付费的学生评为base_pay

2.)记录所有每12周付费且DATEADD(client.last_payment, INTERVAL pay_profile.interval WEEKS)>= budget.period_start<= DATEADD(budget.period_start, INTERVAL 28 DAYS)accounts_receivable

的学生

3。)由于上述步骤将错过已经在预算期内付款的人(因为这会更新他们的last_payment约会,将他们排除在#2中指定的范围之外),我还需要SUM pay_history .date也适用于上述范围。 paid_in_full

4。)重复上面的步骤2,调整未来时期的范围和列名称(即accounts_receivable_2

5.。)使用php来SUM base_payaccounts_receivablepay_history,重复这个过程。

我猜最简单的方法是使用CASE,我以前没做过。这是我最好的猜测,由于sytax错误而失败。我假设我可以在DATE_ADD声明中使用WHEN

SELECT 
CASE 
    DATE_ADD(client.last_payment, INTERVAL pay_profile.interval WEEK) >= budget.period_start 
    AND 
    DATE_ADD(client.last_payment, INTERVAL pay_profile.interval WEEK) <=                                                           
    DATE_ADD(budget.period_start,INTERVAL 28 DAY) THEN SUM(pay_profile.price) as base_pay
FROM client
LEFT OUTER JOIN pay_profile ON client.ppid = pay_profile.ppid 
LEFT OUTER JOIN budget ON client.active = 1
WHERE
client.active = 1 

感谢。

0 个答案:

没有答案