Форум OlegON > Программы и оборудование для автоматизации торговли > Системы автоматизации торговли > Супермаг Плюс (Супермаг 2000)

Помогите оптимизировать запрос (Информация о продажах товара по кассовым чекам) : Супермаг Плюс (Супермаг 2000)

16.04.2024 13:29


13.09.2007 15:17
dmware
 
Необходимо сделать следующее. Проанализировать информацию о продаже товаров по кассовым чекам. Сделать вывод о том сколько и какого товара продано.
Просмотрев документ "Структура БД. Раздел I" выяснил, что информация о кассовых чеках находится в таблицах SMCASHCHECKITEMS и SMCASHCHECKS.
Написал следующее.
Данный запрос выведет информацию о кассовых чеках за период с 01.01.2007 по 31.01.2007 с указанием касс и z-отчетов:
Код:
SELECT    SMSTORELOCATIONS.NAME as SMSTORELOCATIONS_NAME,                 
                   SMCASHCHECKS.CHECKNUM as SMCASHCHECKS_CHECKNUM,
                   SMCASHCHECKS.PRINTTIME as SMCASHCHECKS_PRINTTIME,
                   SMCASHCHECKS.ZNUM as SMCASHCHECKS_ZNUM,
                   SMCASHZ.DESKNUM as SMCASHZ_DESKNUM,
                   SMCASHZ.CLOSEDATE as SMCASHZ_CLOSEDATE,
                   ('с 01.01.2007 по 31.01.2007') as TIME_INTERVAL
         FROM      SMCASHCHECKS,                
                   SMSTORELOCATIONS,
                   SMCASHZ 
         WHERE     SUBSTR(SMCASHCHECKS.PRINTTIME, 0, 10) >= 
to_date('01.1.2007', 'DD.MM.YYYY') 
                   AND SUBSTR(SMCASHCHECKS.PRINTTIME, 0, 10) <= 
to_date('31.1.2007', 'DD.MM.YYYY') 
                   AND SMCASHCHECKS.OPCODE IN(1) 
                   AND SMSTORELOCATIONS.ID = SMCASHCHECKS.LOCID
                   AND SMCASHCHECKS.ZNUM = SMCASHZ.ZNUM
                   AND SMCASHZ.LOCID = SMCASHCHECKS.LOCID
                   AND SMCASHCHECKS.DESKNUM = SMCASHZ.DESKNUM
                   AND SUBSTR(SMCASHZ.CLOSEDATE, 0, 10) >= 
to_date('01.1.2007', 'DD.MM.YYYY')
                   AND SUBSTR(SMCASHZ.CLOSEDATE, 0, 10) <= 
to_date('31.1.2007', 'DD.MM.YYYY')
         GROUP BY  SMSTORELOCATIONS.NAME, 
                   SMCASHCHECKS.CHECKNUM,
                   SMCASHCHECKS.PRINTTIME,
                   SMCASHCHECKS.ZNUM,
                   SMCASHZ.DESKNUM,
                   SMCASHZ.CLOSEDATE
         ORDER BY  SMCASHCHECKS.ZNUM
Эта таблица не содержит информацию об артикулах проданного товара. Я могу получить нужные мне данные следующим запросом:
Код:
SELECT    SMSTORELOCATIONS.NAME as SMSTORELOCATIONS_NAME_1, 
                   SMCASHCHECKITEMS.CHECKNUM as SMCASHCHECKITEMS_CHECKNUM,
                   SMCASHCHECKITEMS.ARTICLE as SMCASHCHECKITEMS_ARTICLE,        
                   SUM(SMCASHCHECKITEMS.TOTALSUM) as 
SMCASHCHECKITEMS_TOTALSUM,                   
                   SMCASHCHECKITEMS.ZNUM as SMCASHCHECKITEMS_ZNUM,
                   SMCASHZ.DESKNUM as SMCASHZ_DESKNUM_1,
                   SMCASHZ.CLOSEDATE as SMCASHZ_CLOSEDATE_1
         FROM      SMCASHCHECKITEMS, 
                   SMSTORELOCATIONS,
                   SMCASHZ 
         WHERE     SMSTORELOCATIONS.ID = SMCASHCHECKITEMS.LOCID
                   AND SMCASHCHECKITEMS.ZNUM = SMCASHZ.ZNUM
                   AND SMCASHCHECKITEMS.DESKNUM = SMCASHZ.DESKNUM
                   AND SMCASHZ.LOCID = SMCASHCHECKITEMS.LOCID
                   AND SUBSTR(SMCASHZ.CLOSEDATE, 0, 10) >= 
to_date('01.1.2007', 'DD.MM.YYYY')
                   AND SUBSTR(SMCASHZ.CLOSEDATE, 0, 10) <= 
to_date('31.1.2007', 'DD.MM.YYYY')
         GROUP BY  SMSTORELOCATIONS.NAME, 
                   SMCASHCHECKITEMS.ARTICLE, 
                   SMCASHCHECKITEMS.TOTALSUM, 
                   SMCASHCHECKITEMS.CHECKNUM, 
                   SMCASHCHECKITEMS.ZNUM,
                   SMCASHZ.DESKNUM,
                   SMCASHZ.CLOSEDATE
         ORDER BY  SMCASHCHECKITEMS.ZNUM
Теперь мне нужно связать между собой эти данные. Конечный результат выглядит примерно так:
Код:
SELECT  SMSTORELOCATIONS_NAME as "Место хранения",
        SACARDCLASS.TREE as "Код узла", 
        SACARDCLASS.NAME as "Классификатор", 
        SMCASHCHECKITEMS_ARTICLE as "Артикул",
        SMCARD.NAME as "Наименование товара",
        SUM(SMCASHCHECKITEMS_TOTALSUM) as "Общая сумма по артикулу", 
        TIME_INTERVAL as "Интервал"
FROM    (
         SELECT    SMSTORELOCATIONS.NAME as SMSTORELOCATIONS_NAME,      
                   SMCASHCHECKS.CHECKNUM as SMCASHCHECKS_CHECKNUM,
                   SMCASHCHECKS.PRINTTIME as SMCASHCHECKS_PRINTTIME,
                   SMCASHCHECKS.ZNUM as SMCASHCHECKS_ZNUM,
                   SMCASHZ.DESKNUM as SMCASHZ_DESKNUM,
                   SMCASHZ.CLOSEDATE as SMCASHZ_CLOSEDATE,
                   ('с 01.01.2007 по 31.01.2007') as TIME_INTERVAL
         FROM      SMCASHCHECKS,                
                   SMSTORELOCATIONS,
                   SMCASHZ 
         WHERE     SUBSTR(SMCASHCHECKS.PRINTTIME, 0, 10) >= 
to_date('01.1.2007', 'DD.MM.YYYY') 
                   AND SUBSTR(SMCASHCHECKS.PRINTTIME, 0, 10) <= 
to_date('31.1.2007', 'DD.MM.YYYY') 
                   AND SMCASHCHECKS.OPCODE IN(1) 
                   AND SMSTORELOCATIONS.ID = SMCASHCHECKS.LOCID
                   AND SMCASHCHECKS.ZNUM = SMCASHZ.ZNUM
                   AND SMCASHZ.LOCID = SMCASHCHECKS.LOCID
                   AND SMCASHCHECKS.DESKNUM = SMCASHZ.DESKNUM
                   AND SUBSTR(SMCASHZ.CLOSEDATE, 0, 10) >= 
to_date('01.1.2007', 'DD.MM.YYYY')
                   AND SUBSTR(SMCASHZ.CLOSEDATE, 0, 10) <= 
to_date('31.1.2007', 'DD.MM.YYYY')
         GROUP BY  SMSTORELOCATIONS.NAME, 
                   SMCASHCHECKS.CHECKNUM,
                   SMCASHCHECKS.PRINTTIME,
                   SMCASHCHECKS.ZNUM,
                   SMCASHZ.DESKNUM,
                   SMCASHZ.CLOSEDATE
         ORDER BY  SMCASHCHECKS.ZNUM
        ),
        (        
         SELECT    SMSTORELOCATIONS.NAME as SMSTORELOCATIONS_NAME_1, 
                   SMCASHCHECKITEMS.CHECKNUM as SMCASHCHECKITEMS_CHECKNUM,
                   SMCASHCHECKITEMS.ARTICLE as SMCASHCHECKITEMS_ARTICLE,    
                   (SMCASHCHECKITEMS.TOTALSUM) as 
SMCASHCHECKITEMS_TOTALSUM,                   
                   SMCASHCHECKITEMS.ZNUM as SMCASHCHECKITEMS_ZNUM,
                   SMCASHZ.DESKNUM as SMCASHZ_DESKNUM_1,
                   SMCASHZ.CLOSEDATE as SMCASHZ_CLOSEDATE_1
         FROM      SMCASHCHECKITEMS, 
                   SMSTORELOCATIONS,
                   SMCASHZ 
         WHERE     SMSTORELOCATIONS.ID = SMCASHCHECKITEMS.LOCID
                   AND SMCASHCHECKITEMS.ZNUM = SMCASHZ.ZNUM
                   AND SMCASHCHECKITEMS.DESKNUM = SMCASHZ.DESKNUM
                   AND SMCASHZ.LOCID = SMCASHCHECKITEMS.LOCID
                   AND SUBSTR(SMCASHZ.CLOSEDATE, 0, 10) >= 
to_date('01.1.2007', 'DD.MM.YYYY')
                   AND SUBSTR(SMCASHZ.CLOSEDATE, 0, 10) <= 
to_date('31.1.2007', 'DD.MM.YYYY')
         GROUP BY  SMSTORELOCATIONS.NAME, 
                   SMCASHCHECKITEMS.ARTICLE, 
                   SMCASHCHECKITEMS.TOTALSUM, 
                   SMCASHCHECKITEMS.CHECKNUM, 
                   SMCASHCHECKITEMS.ZNUM,
                   SMCASHZ.DESKNUM,
                   SMCASHZ.CLOSEDATE
         ORDER BY  SMCASHCHECKITEMS.ZNUM
        ),
        SACARDCLASS,
        SMCARD
WHERE   SMSTORELOCATIONS_NAME = SMSTORELOCATIONS_NAME_1
        AND SACARDCLASS.ID = SMCARD.IDCLASS
        AND SMCARD.ARTICLE = SMCASHCHECKITEMS_ARTICLE
        AND SMCASHCHECKS_CHECKNUM = SMCASHCHECKITEMS_CHECKNUM
        AND SMCASHCHECKS_ZNUM = SMCASHCHECKITEMS_ZNUM
        AND SMCASHZ_DESKNUM = SMCASHZ_DESKNUM_1
        AND SMCASHZ_CLOSEDATE = SMCASHZ_CLOSEDATE_1
        
GROUP BY SMSTORELOCATIONS_NAME, 
         SACARDCLASS.TREE, 
         SACARDCLASS.NAME, 
         SMCASHCHECKITEMS_ARTICLE, 
         SMCARD.NAME,
         TIME_INTERVAL
ORDER BY SMCASHCHECKITEMS_ARTICLE
Пока тестировал только на двух артикулах: вроде бы как правильно считается.
Попробовал задать выполнение по всем артикулам за указанный период и... не дождался результата. Время не фиксировал, но субъективно - очень долго.
Как мне оптимизировать запрос? Помогите, пожалуйста.
13.09.2007 15:21
Mtirt
 
1. Не поняла, что ты хочешь получить в итоге. Нарисуй табличку, что ли...
2. Может тебе поможет анализ отчета "Почасовая статистика по группам товаров"? Он в См2000 считается очень и очень быстро... Только там другая таблица используестся.. SMTimeSpanSale...
13.09.2007 15:25
dmware
 
Цитата:
Mtirt 1. Не поняла, что ты хочешь получить в итоге. Нарисуй табличку, что ли...
2. Может тебе поможет анализ отчета "Почасовая статистика по группам товаров"? Он в См2000 считается очень и очень быстро... Только там другая таблица используестся.. SMTimeSpanSale...
Вот результат выполнения по двум артикулам (см.вложенный файл)
Миниатюры
Нажмите на изображение для увеличения
Название: Clipboard01.jpg
Просмотров: 688
Размер:	11.6 Кб
ID:	118  
13.09.2007 15:31
Mtirt
 
Не вижу тут нербходимости перелопачивать все чеки. Чем тебя документы не устраивают?
13.09.2007 15:36
dmware
 
Инициатива не моя:)
Хотят видеть объективную и достоверную информацию со всех сторон.
Что касается Супермажного отчета - хорош. Хотел бы сказать, что велосипед изобретаем, но для получения данных нужно зайти удаленно в магазин, запустить отчет. Не иначе. А если магазинов много?
Предполагается, что мой отчет будет выполняться по выбранным пользователем магазинам.
13.09.2007 15:38
Mtirt
 
Таблица SMTimeSpanSale, на которой и строится этот отчет доступна в ЦО. В полном объеме и по всем магазинам.
13.09.2007 15:42
dmware
 
Цитата:
Mtirt Таблица SMTimeSpanSale, на которой и строится этот отчет доступна в ЦО. В полном объеме и по всем магазинам.
Спасибо. Ничего о ней не знал. Сейчас посмотрю.
13.09.2007 15:57
dmware
 
Ясно, посмотрел. Как говорится, нормальные герои всегда идут в обход)
Ну, а место продажи, если использовать SMTimeSpanSale, можно определить из SMDOCUMENTS (поле LOCATIONFROM), если не ошибаюсь?
13.09.2007 15:58
Mtirt
 
Цитата:
dmware Инициатива не моя:)
Хотят видеть объективную и достоверную информацию со всех сторон.
Что касается Супермажного отчета - хорош. Хотел бы сказать, что велосипед изобретаем, но для получения данных нужно зайти удаленно в магазин, запустить отчет. Не иначе. А если магазинов много?
Предполагается, что мой отчет будет выполняться по выбранным пользователем магазинам.
Ага, а потом замучаешься отвечать на вопросы, почему отчеты не идут друг с другом, если в магазине просто сняли на кассе Z-отчет за 2 часа до окончания работы магазина, а потом продолжили на ней работать...
13.09.2007 16:00
Mtirt
 
Цитата:
dmware Ясно, посмотрел. Как говорится, нормальные герои всегда идут в обход)
Ну, а место продажи, если использовать SMTimeSpanSale, можно определить из SMDOCUMENTS (поле LOCATIONFROM), если не ошибаюсь?
Да. Всё верно.
Часовой пояс GMT +3, время: 13:29.

Форум на базе vBulletin®
Copyright © Jelsoft Enterprises Ltd.
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.