Объедините несколько таблиц для создания представления

my_array = ["Some_xyz_process",
            "Start", "2018-07-12", "12:59:53,397",
            "End", "2018-07-12", "12:59:55,913"]

require 'date'

fmt = '%Y-%m-%d%H:%M:%S,%L'
is = my_array.index('Start')
  #=> 1
ie = my_array.index('End') 
  #=> 4
DateTime.strptime(my_array[ie+1] + my_array[ie+2], fmt).to_time -
DateTime.strptime(my_array[is+1] + my_array[is+2], fmt).to_time
  #=> 2.516 (seconds)

См. DateTime # strptime и DateTime # (последнее для директив формата). Пока известны форматы даты и времени, я всегда предпочитаю strptime - parse. Вот пример того, почему:

DateTime.parse 'Theresa May has had a bad week over Brexit'
  #=> #`.
1
задан Neetu 19 January 2019 в 17:57
поделиться

3 ответа

Вы можете union all четыре таблицы и отменить суммы в debittable:

SELECT uid, amt,      dat FROM credittable1 UNION ALL
SELECT uid, amt,      dat FROM credittable2 UNION ALL
SELECT uid, amt,      dat FROM credittable3 UNION ALL
SELECT uid, -1 * amt, dat FROM debittable
0
ответ дан Mureinik 19 January 2019 в 17:57
поделиться

Я думаю, я бы сделал это, чтобы получить базовые данные:

select uid, date, sum(credit) as credit, sum(debit) as debit
from ((select uid, dat amt as credit, 0 as debit
       from credittable1
      ) union all
      (select uid, dat amt as credit, 0 as debit
       from credittable2
      ) union all
      (select uid, dat amt as credit, 0 as debit
       from credittable3
      ) union all
      (select uid, dat, 0, - amt
       from debittable
      )
     ) ad
group by uid, dat
order by uid, date;

Затем вы можете использовать переменные для получения баланса:

select uid, date,
       (@b := if(@u = uid, @u + credit + debit,
                 if(@u := uid, credit + debit, credit + debit)
                )
       ) as balance
from (select uid, date, sum(credit) as credit, sum(debit) as debit
      from ((select uid, dat amt as credit, 0 as debit
             from credittable1
            ) union all
            (select uid, dat amt as credit, 0 as debit
             from credittable2
            ) union all
            (select uid, dat amt as credit, 0 as debit
             from credittable3
            ) union all
            (select uid, dat, 0, - amt
             from debittable
            )
           ) ad
      group by uid, date
      order by uid, date
     ) ud cross join
     (select @u := -1, @b := 0) balance;

Или в MySQL 8+ может использовать накопленную сумму:

sum(debit + credit) over (partition by uid order by date)
0
ответ дан Gordon Linoff 19 January 2019 в 17:57
поделиться

UNION ALL по всем таблицам дает вам основу (и вам следует подумать о том, чтобы изменить схему и просто использовать только одну такую ​​таблицу с самого начала).

Для баланса вы можете использовать подзапрос, который получает сумму «предыдущих» сумм. «Предыдущий» здесь означает бронирование с датой, меньшей или равной дате текущего бронирования. Поскольку в один день может быть больше бронирований, нам нужен второй критерий, чтобы отделить их друг от друга. Вот тут sno вступает в игру - оно также должно быть меньше или равно текущему. Чтобы убедиться, что sno уникален во всем наборе, а не только в той таблице, из которой он получен, мы добавляем уникальный идентификатор таблицы.

В MySQL 8.0 для этого можно использовать оконную сумму, что значительно упрощает ее. Но я предполагаю, что вы находитесь на меньшей версии.

SELECT x.amnt,
       x.dat,
       (SELECT coalesce(sum(amnt), 0)
               FROM (SELECT concat('c1-', sno) sno
                            amnt,
                            dat
                            FROM credittable1
                            WHERE uid = 1
                     UNION ALL
                     SELECT concat('c3-', sno) sno,
                            amnt,
                            dat
                            FROM credittable2
                            WHERE uid = 1
                     UNION ALL
                     SELECT concat('c3-', sno) sno,
                            amnt,
                            dat
                            FROM credittable3
                            WHERE uid = 1
                     UNION ALL
                     SELECT concat('d1-', sno) sno,
                            -1 * amnt,
                            dat
                            FROM debittable
                            WHERE uid = 1) y
               WHERE y.dat <= x.dat
                     AND y.sno <= x.sno) bal
       FROM (SELECT concat('c1-', sno) sno,
                    amnt,
                    dat
                    FROM credittable1
                    WHERE uid = 1
             UNION ALL
             SELECT concat('c2-', sno) sno,
                    amnt,
                    dat
                    FROM credittable2
                    WHERE uid = 1
             UNION ALL
             SELECT concat('c3-', sno) sno,
                    amnt,
                    dat
                    FROM credittable3
                    WHERE uid = 1
             UNION ALL
             SELECT concat('d1-', sno) sno,
                    -1 * amnt,
                    dat
                    FROM debittable
                    WHERE uid = 1) x
       ORDER BY x.dat;
0
ответ дан sticky bit 19 January 2019 в 17:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: