Несколько ежемесячных отчетов в течение ежемесячного платежного цикла - PullRequest
0 голосов
/ 07 ноября 2018

Предполагается, что каждый отдел имеет только одну выписку за ежемесячный платежный цикл.

Моя цель состоит в том, чтобы выяснить, сколько отделов было затронуто более чем одной выпиской по счету за один и тот же платежный цикл.

КОНТЕКСТ:

Мой текущий запрос настроен на проверку только тех отделов, которые должны оплачиваться ежемесячно.

Таблица отделов имеет отношение «один ко многим» с таблицей «Выписка» (ожидается, что отдел будет иметь одну выписку в конце каждого цикла выставления счетов)

У каждого выписки по счету есть своя закрытая дата

a.payment_period = 1 представляет отделы, счета которых выставляются ежемесячно

Я также пытался выполнять поиск между конкретными датами истечения срока действия для каждого аккаунта.

Проблема с моим запросом состоит в том, что он выводит общее количество счетов closed_dates, а не проверяет только несколько вхождений в цикле оплаты.

Как можно изменить этот запрос, чтобы выводить только отделы с более чем одним экземпляром ежемесячного счета в течение цикла выставления счетов каждого отдела?

QUERY:

    SELECT s.department, s.statement, COUNT(s.closed_date) AS sd, from_unixtime(s.closed_date)
    FROM statement s
    INNER JOIN department d
    ON s.department=d.department
    WHERE from_unixtime(s.closed_date) BETWEEN 
    DATE_SUB(from_unixtime(d.exp_date), INTERVAL 1 MONTH) AND 
    from_unixtime(d.exp_date)  
    AND d.period=1
    GROUP BY s.statement DESC
    HAVING sd>1

ВЫБОР ВЫБОРА:

department  statement        sd     closed_date
1719712        9351464        3     2018-09-24 
1719709        9351463        2     2018-09-24 
1719708        9351462        2     2018-09-24 
1719665        9351457        3     2018-09-24 

1 Ответ

0 голосов
/ 08 ноября 2018

Похоже, вы пытаетесь группировать по месяцам.

В MySQL это работа для функции LAST_DAY(). Шаблон, который вам нужен для этого:

 SELECT a, b, LAST_DAY(datestamp) month_ending, SUM(c) c, MAX(d) maxd
   FROM table
  GROUP BY a, b, LAST_DAY(datestamp)

Итак, для вашей ситуации вы сначала хотите найти ситуации с более чем одним счетом за любой данный месяц.

Я должен догадаться, потому что я не понимаю значения exp_date. Это должно делать то, что вы хотите.

      SELECT s.department, LAST_DAY(FROM_UNIXTIME(s.closed_date)) month_ending,
             COUNT (*) statement_count
        FROM statement s
        JOIN department d ON s.department = d.department
       WHERE d.period = 1
         AND s.closed_date >=  (FROM_UNIXTIME(d.exp)) - INTERVAL 1 MONTH
         AND s.closed_date <   (FROM_UNIXTIME(d.exp)) 
       GROUP BY s.department, LAST_DAY(FROM_UNIXTIME(s.closed_date))
       HAVING COUNT(*) > 1

Это дает набор результатов с одной строкой на отдел в месяц, отфильтрованный так, что он показывает только отделы с несколькими счетами.

...