02.07.2017 09:06
Добрый день.
Прошу помощи профи, сам уже видимо не соображу.
Задача посчитать кол-во покупателей за период времени по группам товара. Делаю выборку чеков с условием - если за указанный период времени в чеке присутствует товар из группы то мы его считаем.
Ниже запрос, проблема в том что он считает сколько раз товар присутствовал в чеке а не кол-во чеков т.е. чеков может быть 29 а вот товар присутствовал в чеках 34 раза.

select count(CHES.PRINTTIME),SMgroup.name
from
supermag.SMCASHCHECKS CHES
, supermag.SMCASHCHECKITEMS CHETOW
, supermag.smcard CMS
, supermag.SACARDCLASS SMgroup
where CHES.PRINTTIME > to_date(TRANSLATE('2015-12-27 00:00:00','00:00:00','01:59:59'),'YYYY.MM.DD HH24:MI:SS')
and CHES.PRINTTIME < to_date('2015-12-27 23:48:00','YYYY.MM.DD HH24:MI:SS')
and CHETOW.CHECKNUM=CHES.CHECKNUM
and CHETOW.DESKNUM=CHES.DESKNUM
and CHETOW.ZNUM=CHES.ZNUM
and CHETOW.ARTICLE=cms.ARTICLE and SMgroup.ID=CMS.IDclass
and CMS.IDclass = '112'
GROUP BY SMgroup.name

Если задавать в коде отображение только кол-во чеков
select count(count(CHES.PRINTTIME))
from
и группировать только по клич-ву чеков GROUP BY CHES.PRINTTIME
то получим реальное кол-во чеков = 29, но как в отчет вывести наименование группы товара?

Вопрос: как вывести в результат итого кол-ва чеков и группу товара.
02.07.2017 10:09
Первое, что приходит в голову
SQL код:
select count(distinct CHES.PRINTTIME) 
(на самом деле первое - почему бы не воспользоваться тегом кода)
но в целом не очень понятно, зачем имя группы выводить из базы, когда оно уникальное по входным данным.
02.07.2017 10:48
Спасибо большое, получилось. В дальнейшем данный запрос будет использоваться в отчете на fastReport, (CMS.IDclass) id группы будет поступать из диалога отчета т.е. на выходе получим список групп и по каждой кол-во чеков. Код будет выглядеть вот так:

// данные отчета
string sSQL =
SqlFormat(&quot;select&quot;+
&quot; COUNT(distinct CHES.PRINTTIME) COUTCH&quot;+
&quot;,SMgroup.name&quot;+
&quot;,SMgroup.tree&quot;+
&quot; from&quot;+
&quot; supermag.SMCASHCHECKS CHES&quot;+
&quot;, supermag.SMCASHCHECKITEMS CHETOW&quot;+
&quot;, supermag.SVCardName crd&quot;+
&quot;, supermag.SACARDCLASS SMgroup&quot;+
&quot; where CHES.PRINTTIME between &quot;+RepSqlText.ToSqlDate(sFirstDate)+&quot; and &quot;+RepSqlText.ToSqlDate(sLastDate)+
&quot; and CHETOW.CHECKNUM=CHES.CHECKNUM&quot;+
&quot; and CHETOW.DESKNUM=CHES.DESKNUM&quot;+
&quot; and CHETOW.ZNUM=CHES.ZNUM&quot;+
&quot; and CHETOW.ARTICLE=crd.ARTICLE&quot;+
&quot; and SMgroup.ID=crd.IDclass&quot;+
RepOracleRunner.ExecuteScalar&lt;string&gt;(host.Connection, &quot;select supermag.reptools.classstring (4, 'crd') from dual&quot;)+
&quot; GROUP BY SMgroup.name, SMgroup.tree&quot;
);
host.TableDataSourcePreInit(&quot;RepData&quot;, sSQL);
}
}
02.07.2017 10:55
Не надо по PRINTTIME.
Оно же не уникально. На другой кассе такое-же может быть.
Лучше
Код:
COUNT ( DISTINCT TO_CHAR(CHES.LOCID)||'.'||TO_CHAR(CHES.DESKNUM)||'.'||TO_CHAR(CHES.ZNUM)||'.'||TO_CHAR(CHES.CHECKNUM) )
02.07.2017 11:55
Цитата:
vdm Не надо по PRINTTIME.
Оно же не уникально. На другой кассе такое-же может быть.
Лучше
Код:
COUNT ( DISTINCT TO_CHAR(CHES.LOCID)||'.'||TO_CHAR(CHES.DESKNUM)||'.'||TO_CHAR(CHES.ZNUM)||'.'||TO_CHAR(CHES.CHECKNUM) )

А ведь верно. Кстати столкнулся с еще одной интересной особенностью чеков, у них дата отображается с минутами и часами (2012-10-07 16:05:00) в отличии от обычных документов (2012-10-07 00:00:00).
В итоге если выбрать в диалоге период 2012-10-07 по 2012-10-07 то в отчет данные попадут пустыми, у обычных документов такой проблемы не увидел.
03.07.2017 11:00
сделай trunc(дата)
Часовой пояс GMT +3, время: 13:31.

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