03.07.2020 07:53
GritsenkoIvan
 
Добрый день.
Вопрос по бизнес анализу - есть задача в отчёте отобразить продажи и остатки алкоголя по точкам по каждому алкокоду. Такой отчёт есть, но в нём берётся только два алкокода из карточки (минимальное и максимальное значение).
Код формулы для поля "алкокод1" выглядит так:
select min(alccode) from SMEGAISARTICLES where article = {Поля задачи. 1. Карточка товара. Артикул}
Для второго соответственно max(alccode).
Но в карточке может быть и три и более алкокодов. Прописать в формулу отбор через row_number()

select
alccode
from (
select alccode, row_number() over (order by alccode) rn
from
SMEGAISARTICLES
where
SMEGAISARTICLES.article = {Поля задачи. 1. Карточка товара. Артикул}
)
where rn = 1
(где rn это номер алкокода)

т.к. в итоге выдаёт следующее в логе SmAnalyticsErrorLog:
SELECT (CRD.Article) as Field1,(CRD.Name) as Field2,(select
alccode
from (select alccode, row_number() over (order by alccode) rn
from
SMEGAISARTICLES
where
SMEGAISARTICLES.article = (CRD.Article) )
where
rn = 1) as Field12


ORA-00904: "CRD"."ARTICLE": недопустимый идентификатор
Т.е. в подзапросе не виден артикул. Как обойти это не могу разобраться. проверял запрос не через Супермаг - всё ок.
Кто нибудь рашал похожую задачу через БА?



(0,02Мб)
03.07.2020 10:20
OlegON
 
Я бы в любом случае переписал бы
SQL код:
from
SMEGAISARTICLES
where
SMEGAISARTICLES
.article 
заменив на
SQL код:
from
SUPERMAG
.SMEGAISARTICLES a
where
a
.article 
03.07.2020 11:09
vdm
 
Можно извратиться, подстроившись под sql формируемый супермагом
SQL код:
...
from
smegaisarticles e
smcard crd
where e
.article=crd.article
and e.article = {Поля задачи1. Карточка товараАртикул}
... 
Но лучше подзапрос "алкокод по номеру" вынести в свою функцию в БД, код чище и понятнее будет.
03.07.2020 11:27
vdm
 
Цитата:
vdm and e.article = {Поля задачи. 1. Карточка товара. Артикул}
Хотя нет, так все равно бред получится, "исправленному не верить!", используйте функцию.
06.07.2020 09:37
GritsenkoIvan
 
Создал функцию:
FUNCTION gr_getalcocode (article_name IN VARCHAR2, alcocode_number IN NUMBER)
RETURN number
IS
alco_code VARCHAR2 (255);
alc_number NUMBER (5);
row_num NUMBER (5);
BEGIN
SELECT
alccode INTO alco_code
FROM
(select alccode, row_number() over (order by alccode) rn
from
SUPERMAG.SMEGAISARTICLES a
where
a.article = article_name)
WHERE
rn = alcocode_number;
RETURN alco_code;
END;


Вызываю её в БА так:
select
max(gr_getalcocode({Поля задачи. 1. Карточка товара. Артикул},1))
from
SMEGAISARTICLES

где второй параметр это порядковый номер алкокода.

Есть идеи по оптимизации, т.к. запрос отрабатывает очень долго?
А кроме того возвращает некоторые значения у резаными. Вывод алкокода стоит "строка", если меняю на "целое", то ругается на не верный формат.



(0,01Мб)

Правка: GritsenkoIvan, 06.07.2020 09:41
06.07.2020 10:30
OlegON
 
Можешь просто алгоритм желаемый описать? Я понять не могу, зачем тебе там аналитика и почему у тебя SMEGAISARTICLES столько раз встречается в разных местах.
06.07.2020 11:02
GritsenkoIvan
 
Необходимо отобрать остатки по алкоголю по ЕГАИСу и Супермагу, а так же реализацию по каждому алкокоду за выбранный период.
Изначально код для алкокода выглядел так:
select min(alccode) from SMEGAISARTICLES where article = {Поля задачи. 1. Карточка товара. Артикул}
Для второго алкокода - max(alccode). Но так можно отобрать только два, а их в карточке может быть и 6.

Остатки по алкокоду:
select quantity from SMEGAISRESTS where alccode = {Поля задачи. 3. Алкокод1} and ourfsrarid = 'ФСРАР магазина'
06.07.2020 11:18
OlegON
 
Я в БА не был уже очень давно и вообще не помню, как там и что. Брезгую. Если интересно сам запрос разобрать - дай запрос, либо опиши алгоритм. Не понимаю, что тебе дает аналитика для нумерации строк... И многократное упоминание таблицы, свидетельствует, скорее всего, о том, что ты не ведаешь, что творишь. Цели переобъяснять не надо, я прочитал выше.
06.07.2020 14:07
vdm
 
У меня БА нет и не будет, так что "лечение по фотографии".
Про тормоза - предполагаю что вы ф-ию странным образом используете.
Цитата:
GritsenkoIvan Вызываю её в БА так:
select
max(gr_getalcocode({Поля задачи. 1. Карточка товара. Артикул},1))
from
SMEGAISARTICLES
Так не лучше?
SQL код:
select gr_getalcocode({Поля задачи1. Карточка товараАртикул},1)
from dual 
07.07.2020 02:23
GritsenkoIvan
 
Спасибо, помогло!
Переписал функцию:

FUNCTION gr_getalcocode (input_article_name IN VARCHAR2, input_alcocode_number IN NUMBER)
RETURN VARCHAR2
IS
alco_code VARCHAR2 (255);
alc_number NUMBER (5);
BEGIN
SELECT
alccode INTO alco_code
FROM
(SELECTalccode, row_number() over (order by alccode) rn
FROM
SUPERMAG.SMEGAISARTICLES a
where
a.article = input_article_name)
WHERE
rn = input_alcocode_number;
RETURN alco_code;
END;


Вызов в БА в поле "алкокод №":

SELECT MIN(gr_getalcocode({Поля задачи. 1. Карточка товара. Артикул},3))
FROM dual


Отчёт отрабатывает быстро

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