Mysql Group по определенным временным интервалам - PullRequest
0 голосов
/ 02 июля 2019

Можно ли группировать по определенным временным интервалам, например, у меня есть таблица такого типа:

invoice_id  due_date    invoice_balance
4           2019-02-04  192
5           2019-03-18  0   
6           2019-03-18  3
7           2019-04-24  30392   
8           2019-04-25  47.5    

Теперь у меня много таких записей, и я хочу, чтобы они группировались по определенным интервалам дат ( сегодня, сегодня + 7 дней, 7 дней до 30 дней, более 30 дней) с общей суммой:

Ожидаемые результаты:

total  date between
2000   today
2000   today+7 day
2000   7dayto30day
2000   morethan30days

поэтому я попробовал что-то вроде этого:

SELECT SUM(invoice_balance) as sum,invoice_id, due_date 
FROM `my_invoice_master` 
GROUP BY if(due_date between "2019-02-04" and "2019-04-26",0,1),if(due_date between "2019-07-05" and "2019-07-09",0,1) 
ORDER BY u.meta_value asc LIMIT 0 , 10

Но это не работает, есть ли способ вернуть результат с указанными интервалами дат?

Ответы [ 2 ]

1 голос
/ 02 июля 2019

Вы можете сделать это с условным агрегированием:

SELECT 
  SUM(case 
        when due_date = current_date then invoice_balance 
        else 0 
      end) as `today`,
  SUM(case 
        when due_date between current_date + interval 1 day and current_date + interval 7 day then invoice_balance 
        else 0 
      end) as `today+7 day`,
  SUM(case 
        when due_date between current_date + interval 8 day and current_date + interval 30 day then invoice_balance 
        else 0 
      end) as `7dayto30day`,  
  SUM(case 
        when due_date > current_date + interval 30 day then invoice_balance 
        else 0 
      end) as `morethan30days`
FROM `my_invoice_master` 
0 голосов
/ 02 июля 2019

Вы можете использовать функцию IF:

select invoice_id, invoice_balance, 
  IF(DATEDIFF(DATE(due_date), DATE(NOW()))<=7
    , IF(DATEDIFF(DATE(due_date), DATE(NOW()))>0, 'today+7', 'today')
    , IF(DATEDIFF(DATE(due_date), DATE(NOW()))<=30, '7dayto30day', 'morethan30days')
  ) as due_period
from my_invoice_master

В этом запросе отображаются все записи по периодам.Если значение due_date будет меньше, чем сегодня, оно получает вас «сегодня».


Если вам нужна сумма invoice_balance по invoice_id , используйте это:

select invoice_id, sum(invoice_balance), 
  @due_period:= IF(DATEDIFF(DATE(due_date), DATE(NOW()))<=7
    , IF(DATEDIFF(DATE(due_date), DATE(NOW()))>0, 'today+7', 'today')
    , IF(DATEDIFF(DATE(due_date), DATE(NOW()))<=30, '7dayto30day', 'morethan30days')
  ) as due_period
from my_invoice_master
group by invoice_id, @due_period

Если вам нужна сумма invoice_balance по периодам, используйте это:

select sum(invoice_balance), 
  @due_period:= IF(DATEDIFF(DATE(due_date), DATE(NOW()))<=7
    , IF(DATEDIFF(DATE(due_date), DATE(NOW()))>0, 'today+7', 'today')
    , IF(DATEDIFF(DATE(due_date), DATE(NOW()))<=30, '7dayto30day', 'morethan30days')
  ) as due_period
from my_invoice_master
group by @due_period
...