Разделение данных по кассам

Last modified by Nefedenkova Viktoria on 2021/03/19 16:33

Файл с описанием основных полей для базовых таблиц продаж в кассовой схеме.

Как выполнить разделение данных о продажах по кассам?

Запрос SELECT * from tmdb_comenz - выводит "шапку" чека, где:

1. tmdb_sold - смены
Name               Type          Nullable  Default  Comments
NRDOC              INTEGER                          Электронный номер смены
ID_CASA            INTEGER                          Код кассы из справочника O,CASA

2. tmdb_comenz - чеки
 NRDOC            NUMBER(10)     Y       Электронный номер смены (для связи с tmdb_sold.nrdoc)

select d.* ,

(select  s.id_casa from tmdb_sold s where s.nrdoc=d.nrdoc and rownum=1) id_casa
from tmdb_comenz d

and rownum=1 -> and s.sid = d.sid  - если для архивной кассовой схемы

sid + nrdoc - это первичный ключ в tmdb_sold, в comenz - sid + cod и если нужно читать данные за большие периоды - лучше соединить таблицы вместо подзапроса.
Например, когда нужно читать данные за от месяца до 3-х месецев:


 select --d.*
  (select  s.id_casa from tmdb_sold s where s.nrdoc=d.nrdoc and  s.sid = d.sid) id_casa
 --,(select  count(s.id_casa) from tmdb_sold s where s.nrdoc=d.nrdoc ) cnt_id_casa
 , d.*
from tmdb_comenz d
--order by cnt_id_casa desc

Почему кассы имеют нумерацию 101 и 102 а не 1 и 2?

101 - первый магазин, первая касса.
102 - первый магазин, вторая касса.
...
N0M - N-й магазин, M-я касса.

Ключ кассы уникален в рамках всей сети.

select ...
from tmdb_comenz c, tmdb_sold s
where c.sid = s.sid
  and c.nrdoc = s.nrdoc
  and trunc(c.data) between :start_date and :end_date

В зависимости от периода оптимизатор сам выберет, что эффективнее - соединять по индексу или full scan.