我多次尝试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_pay
,accounts_receivable
和pay_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
感谢。