Как можно создать представление с подсчитанными суммами из вторичного представления? - PullRequest
0 голосов
/ 20 января 2019

У меня есть представление, созданное для генерации отчета о проверке критически важного крона, который запускается еженедельно. Представление показывает еженедельные пробеги, Сумма всех зачисленных счетов, (некоторый кредит идет на ТАК приятелей за мои результаты!), сумма ОТКРЫТЫХ счетов, сумма закрытых счетов, основные вещи.

mysql> select * from view_command_OPEN_CLOSED_tally limit 5;
+---------------------+-------------------------+-----------------------+---------------------+-------------------+----------------------+--------------------+
| created             | total_accounts_credited | total_amount_credited | total_open_credited | total_amount_open | total_closed_credited| total_amount_closed|
+---------------------+-------------------------+-----------------------+---------------------+-------------------+----------------------+--------------------+
| 2019-01-19 00:00:00 |                   18175 |               3173.68 |               16953 |           7063.68 |                 1222 |             110.00 |
| 2019-01-12 00:00:00 |                   18135 |               4768.43 |               17053 |           9358.43 |                 1082 |             410.00 |
| 2019-01-10 09:00:27 |                      80 |               1497.75 |                  80 |           1497.75 |                    0 |               0.00 |
| 2019-01-09 09:20:55 |                      51 |                933.50 |                  50 |            915.75 |                    1 |              17.75 |
| 2019-01-08 16:45:14 |                      10 |                187.50 |                  10 |            187.50 |                    0 |               0.00 |
+---------------------+-------------------------+-----------------------+---------------------+-------------------+----------------------+--------------------+

Я предположил, что мог бы легко сгенерировать второе представление из этого с подзапросом, который бы показывал разницу в процентах от предыдущей недели. IE: Создан, total_accounts_credited, diff_from_last_week_in_percent, total_ammount_credited, diff_in_percent_from_last_week и т. Д ... Я не могу получить результаты своей предыдущей недели, чтобы соответствовать данным и рассчитать процент. Результирующий набор отображает некоторую строку предыдущего Все запросы, которые я пробовал, вращались вокруг базового левого соединения, но по какой-то причине результат «предыдущая неделя» не отображается в соответствующем месте. Я, очевидно, делаю что-то направленное на MySQL в моем подходе, и в ответ это выдает мне непоследовательный набор результатов.

mysql> SELECT vtally.created,
    ->        vtally.total_accounts_credited,
    ->        vtally2.total_accounts_credited `previous`,
    ->        vtally.total_open_credited ,
    ->        vtally2.total_open_credited `previous`,
    ->        vtally.total_closed_credited,
    ->        vtally2.total_closed_credited`previous`
    -> FROM view_command_OPEN_CLOSED_tally vtally
    -> LEFT JOIN view_command_OPEN_CLOSED_tally vtally2
    ->   ON vtally.created = vtally2.created - INTERVAL 7 DAY
    -> GROUP BY
    ->   DATE(vtally.created)
    -> ORDER BY vtally.created DESC LIMIT 2;
+---------------------+-------------------------+----------+---------------------+----------+----------------------+----------+
| created             | total_accounts_credited | previous | total_open_credited | previous | total_closed_credited | previous |
+---------------------+-------------------------+----------+---------------------+----------+----------------------+----------+
| 2019-01-19 00:00:00 |                    8175 |     NULL |                6953 |     NULL |                  222 |     NULL |
| 2019-01-12 00:00:00 |                    8135 |     8175 |                7053 |     6953 |                  082 |     1222 |
+---------------------+-------------------------+----------+---------------------+----------+----------------------+----------+

Приведенный выше набор результатов является примером, Я ожидал, что результат будет следующим: каждый предыдущий столбец будет содержать результат предыдущей недели столбца слева:

(только верхний ряд, без учета нижнего ряда)

+---------------------+-------------------------+----------+---------------------+----------+----------------------+----------+
| created             | total_accounts_credited | previous | total_open_credited | previous | total_closed_credited | previous |
+---------------------+-------------------------+----------+---------------------+----------+----------------------+----------+
| 2019-01-19 00:00:00 |                    8175 |     8135 |                6953 |     7053 |                  222 |     082 |
| 2019-01-12 00:00:00 |                    8135 |     8175 |                7053 |     6953 |                  082 |     1222 |
+---------------------+-------------------------+----------+---------------------+----------+----------------------+----------+

Чего мне не хватает, чтобы иметь правильную «предыдущую» сумму в соответствующем столбце?

Я полагаю, что это может быть Group BY, но понятия не имею, куда идти, похоже, перепробовал все варианты.

1 Ответ

0 голосов
/ 20 января 2019

, если vtally2 представляет предыдущие данные, что означает vtally.created > vtally2.created.

. Поэтому измените минус на плюс: vtally.created = vtally2.created + INTERVAL 7 DAY в вашем объединении.

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

Примерно так:

WITH numbered_tally AS (
    select created, total_accounts_credited, total_open_credited, total_closed_credited,
           row_number() OVER (ORDER BY created) AS tally_number
    from view_command_OPEN_CLOSED_tally
)
SELECT  vtally.created,
        vtally.total_accounts_credited,
       vtally2.total_accounts_credited `previous`,
        vtally.total_open_credited ,
       vtally2.total_open_credited `previous`,
        vtally.total_closed_credited,
       vtally2.total_closed_credited `previous`
FROM numbered_tally  vtally
LEFT JOIN numbered_tally  vtally2
   ON vtally.tally_number = 1 + vtally2.tally_number
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...