Интервал времени и выборка по дате - MySQL

Узнай цену своей работы

Формулировка задачи:

SELECT
  S.NAME                                  AS SERVICES,
  SUM(IF(P.DATE < '2017-01-01', ROUND(SUMMA, 2), 0)) AS DATE,
  SUM(IF(PAY_ID = 3, ROUND(SUMMA, 2), 0)) AS RECALCULATION,
  SUM(IF(SUMMA > 0, ROUND(SUMMA, 2), 0))  AS INCOMING,
  SUM(IF(SUMMA < 0, ROUND(SUMMA, 2), 0))  AS EXPENSE,
  SUM(ROUND(SUMMA, 2))                    AS TOTAL
FROM (SELECT
        C.ID,
        P.SUMMA,
        P.DATE,
        P.ACNT_ID,
        P.PAY_ID
      FROM payments P
        LEFT JOIN clients AS C ON (C.id = P.CLIENT_ID)
      ) AS P
  LEFT JOIN services S ON (P.ACNT_ID = S.id)
  LEFT JOIN payments_type AS T ON (PAY_ID = T.id)
WHERE  DATE BETWEEN '2017-01-01' AND '2017-12-31'
GROUP BY ACNT_ID
test.rar База данных. Подскажите как реализовать баланс на начало периода.
SUM(IF(P.DATE < '2017-01-01', ROUND(SUMMA, 2), 0)) AS DATE,
Не работает из за
WHERE  DATE BETWEEN '2017-01-01' AND '2017-12-31'

Решение задачи: «Интервал времени и выборка по дате»

textual
Листинг программы
SELECT
  S.NAME                                  AS SERVICES,
  X.DATE                                  AS DATE,
  SUM(IF(PAY_ID = 3, ROUND(SUMMA, 2), 0)) AS RECALCULATION,
  SUM(IF(SUMMA > 0, ROUND(SUMMA, 2), 0))  AS INCOMING,
  SUM(IF(SUMMA < 0, ROUND(SUMMA, 2), 0))  AS EXPENSE,
  SUM(ROUND(SUMMA, 2))                    AS TOTAL
FROM (SELECT
        C.ID,
        P.SUMMA,
        P.DATE,
        P.ACNT_ID,
        P.PAY_ID
      FROM payments P
        LEFT JOIN clients AS C ON (C.id = P.CLIENT_ID)
     ) AS P
  LEFT JOIN services S ON (P.ACNT_ID = S.id)
  LEFT JOIN payments_type AS T ON (PAY_ID = T.id)
  LEFT JOIN (SELECT
               S.NAME,
               ROUND(SUMMA, 2) DATE
             FROM (SELECT
                     P.SUMMA,
                     P.ACNT_ID,
                     P.DATE
                   FROM payments P
                     LEFT JOIN clients AS C ON (C.id = P.CLIENT_ID)
                  ) AS P
               JOIN services S ON (P.ACNT_ID = S.id)
             WHERE P.DATE < '2017-01-01'
             GROUP BY S.NAME
            ) AS X ON S.NAME = X.NAME
WHERE P.DATE BETWEEN '2017-01-01' AND '2017-12-31'
GROUP BY ACNT_ID

Объяснение кода листинга программы

  1. Код написан на SQL (Structured Query Language), который является языком запросов к реляционным базам данных.
  2. Задача заключается в выборке данных из нескольких таблиц базы данных с условием по дате.
  3. В первой части кода происходит объединение таблиц payments, clients, services и payments_type по соответствующим идентификаторам.
  4. Во второй части кода происходит подсчет суммы платежей для каждого вида услуг с учетом даты и идентификатора счета.
  5. Результаты подсчета записываются в отдельные переменные с названиями RECALCULATION, INCOMING, EXPENSE и TOTAL.
  6. В конце кода происходит группировка результатов по идентификатору счета и применение условия по дате с помощью оператора WHERE.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 4.1 из 5