2016-09-15 2 views
2

У меня есть таблицыСделать книгу в sqlite?

t1 (вставка данных клиента)

Date  id idCl nameCl opening 
1-8-2016  10L CL-J Jon  0  
15-8-2016 20L CL-B Ben  0 
25-8-2016 15.5L CL-A Alina  0  
28-8-2016 10L CL-B Ben  0 
30-8-2016 20L CL-J Jon  0 

t2 (полученные клиентом)

Date  id idCl nameCl receive 
1-9-2016  10L CL-J Jon  2000 
1-9-2016  10L CL-J Jon  1000 
5-9-2016  20L CL-B Ben  3000 
10-9-2016 15.5L CL-A Alina 5000 
12-9-2016 10L CL-B Ben  8000 
22-9-2016 20L CL-J Jon  2000 

я хочу t3 как этот

Date  id idCl nameCl opening dr  closing 
1-9-2016  10L CL-J Jon  0  2000  2000 
22-9-2016 20L CL-J Jon  2000 1000  3000 
1-9-2016  10L CL-J Jon  3000 2000  5000 
5-9-2016  20L CL-B Ben  0  3000  3000 
12-9-2016 10L CL-B Ben  3000 8000 11000 
10-9-2016 15.5L CL-A Alina  0  5000  5000 

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

ответ

0

Предлагается двухкомпонентное решение.
Первая часть (после начального mcve-makig) представляет собой минимальный запрос, чтобы приблизиться к вашему желаемому результату (за исключением странного порядка 22 сентября, 12-е и 10-е из-за сортировки по idCl с более высоким приоритетом).
Вторая часть тратит довольно много усилий на сортировку по дате, которая отформатирована соответствующим образом.

-- make my mcve 
-- (including unused table t1, as a nicety to others wanting to answer) 
drop table if exists t1 ; 
create table t1 (Date date, id varchar(10), idCl varchar(10), nameCl varchar(30), opening int); 
drop table if exists t2; 
create table t2 (Date date, id varchar(10), idCl varchar(10), nameCl varchar(30), receive int); 

insert into t1 values ('1-8-2016', '10L', 'CL-J', 'Jon', 0); 
insert into t1 values ('15-8-2016', '20L', 'CL-B', 'Ben', 0); 
insert into t1 values ('25-8-2016', '15.5L', 'CL-A', 'Alina', 0); 
insert into t1 values ('28-8-2016', '10L', 'CL-B', 'Ben', 0); 
insert into t1 values ('30-8-2016', '20L', 'CL-J', 'Jon', 0); 

insert into t2 values ('1-9-2016', '10L', 'CL-J', 'Jon', 2000); 
insert into t2 values ('1-9-2016', '10L', 'CL-J', 'Jon', 1000); 
insert into t2 values ('5-9-2016', '20L', 'CL-B', 'Ben', 3000); 
insert into t2 values ('10-9-2016', '15.5L', 'CL-A', 'Alina', 5000); 
insert into t2 values ('12-9-2016', '10L', 'CL-B', 'Ben', 8000); 
insert into t2 values ('22-9-2016', '20L', 'CL-J', 'Jon', 2000); 


.headers off 
select '-- simple query, not sorting by date'; 
.headers on 
-- making pretty 
.mode column 
select 
    a.date, 
    a.id, a.idCl, a.nameCL, 
    sum(b.receive)-a.receive as opening, 
    a.receive    as dr, 
    sum(b.receive)   as closing 
from t2 as a inner join t2 as b using (idCl) 
where a.rowid >= b.rowid 
group by a.rowid 
order by a.idCl DESC 
; 

-- preparing the use of date for sorting 
drop table if exists moneys; 
create table moneys (Date date, id varchar(10), idCl varchar(10), nameCl varchar(30), amount int); 
insert into moneys select 
    date(  substr(date,-4,4) 
     ||'-'||substr('0'||replace(substr(date, instr(date, '-'), 3),'-', ''),-2,2) 
     ||'-'||substr('0'||replace(substr(date, 1,2),'-',''),-2,2) 
    ), 
    id, 
    idCl, 
    nameCl, 
    receive 
from t2; 

.headers off 
select ''; 
select '-- advanced query, sorting by correct date'; 
.headers on 
select 
    a.date, a.id, a.idCl, a.nameCL, 
    sum(b.amount)-a.amount as opening, 
    a.amount    as dr, 
    sum(b.amount)   as closing 
from moneys as a inner join moneys as b using (idCl) 
where a.rowid >= b.rowid 
group by a.rowid 
order by a.idCl DESC , a.date 
; 

Выход:

-- simple query, not sorting by date 
Date  id   idCl  nameCl  opening  dr   closing 
---------- ---------- ---------- ---------- ---------- ---------- ---------- 
1-9-2016 10L   CL-J  Jon   0   2000  2000 
1-9-2016 10L   CL-J  Jon   2000  1000  3000 
22-9-2016 20L   CL-J  Jon   3000  2000  5000 
5-9-2016 20L   CL-B  Ben   0   3000  3000 
12-9-2016 10L   CL-B  Ben   3000  8000  11000 
10-9-2016 15.5L  CL-A  Alina  0   5000  5000 

-- advanced query, sorting by correct date 
Date  id   idCl  nameCl  opening  dr   closing 
---------- ---------- ---------- ---------- ---------- ---------- ---------- 
2016-09-01 10L   CL-J  Jon   0   2000  2000 
2016-09-01 10L   CL-J  Jon   2000  1000  3000 
2016-09-22 20L   CL-J  Jon   3000  2000  5000 
2016-09-05 20L   CL-B  Ben   0   3000  3000 
2016-09-12 10L   CL-B  Ben   3000  8000  11000 
2016-09-10 15.5L  CL-A  Alina  0   5000  5000 

Примечание:
1) Второй порядок запроса в хронологическом порядке для самого вывода, и для сортировки линий для изготовления суммы открытия.
2) Вся таблица t1 не используется. Если вы, например, хотите обрабатывать записи, соответствующие существующей учетной записи, затем фильтруйте перед вставкой в ​​промежуточную таблицу «деньги» или записи t2-таблицы, которые будут использоваться.
3) «id» (в отличие от «idCL») не имеет видимого влияния, соответствующего вашему желаемому результату, где, например, Ben составляет 11000. Возможно, вы хотите, чтобы общее общее количество было по всем «id». (Сначала я обрабатывал id отдельно, считая, что они разные учетные записи, потому что они раздельно открыты в t1.)

Смежные вопросы