powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Помогите с запросом
25 сообщений из 49, страница 1 из 2
Помогите с запросом
    #39981658
AlekZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть парсер, он парсит файлы в БД. Файлы бывают разные- со скана, выгрузка с БД, самостоятельно ведомая БД. Данные в них одинаковые, но называются по разному…Поэтому пришлось использовать костыль в виде таблицы Замены (Рокеровки -ну я так это назвал).
Это краткое вступление-почему так коряво то все.
Теперь собственно сама проблема:
Таблица Рокеровка
IDOLD_VALNEW_VALVIDCATEGORY1TV-232СПЕКТ 5ТВТехника2СПЕКТ 5СПЕКТР 5ТВТехника3Бумага СнегСнегурочка А4БумагаОфисные товары

Основная таблица(ALFA):
ID ID_NEW_NAME DAT POSIT SUMMA1 3 18.07.20 5 25002 3 19.07.20 3 15003 3 20.07.20 2 1000

Что собственно надо, нужен отчет который выводит итоговую статистику по продажам, те позиции которые не продавались-должны показывать нули (вот с этим то и проблемы, как это сделать?).

Тот запрос который сейчас есть:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
select
  sum( alfa.posit ) sum_of_posit,
  sum( alfa.summa ) sum_of_summa,
  alfa.dat, 
  rokerovka.category,
  rokerovka.vid 
from rokerovka
  inner join alfa on (rokerovka.id = alfa.id_new_name) 
where (alfa.dat between :d1 and :d2)
group by alfa.dat,rokerovka.category
order by alfa.dat



Он не выводит те "Виды"-по которым нулевые продажи. Ситуация еще немного осложняется тем что БД-FireBird (и она не может селект из селекта,ну и руки у меня кривые).
Модератор: Пользуйтесь тегами!
...
Рейтинг: 0 / 0
Помогите с запросом
    #39981665
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если нужны нули, то может LEFT JOIN вместо INNER?

P.S: Firebird может селект из селекта...
...
Рейтинг: 0 / 0
Помогите с запросом
    #39981668
AlekZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alekcvp, пробовал, результат тот же, только выполняется минуту вместо нескольких секунд. толи не в том порядке таблицы объединяю... пробовал и Right join. Тоже самое.
п.с. утверждать не буду. ФайрБирд 2.5 - не получилось под IBExpert выполнить такой запрос(Селект в селекте).
...
Рейтинг: 0 / 0
Помогите с запросом
    #39981682
Фотография brick08
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekZ,
Код: sql
1.
or alfa.dat is null
...
Рейтинг: 0 / 0
Помогите с запросом
    #39981683
AlekZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну вот например запрос тех позиций которые по нулям. Но как его присоединить к первому запросу...Да еще и с суммами по нулям, и сгрупировать по "ВИДу"

Код: plsql
1.
2.
3.
4.
5.
select VID from rokerovka2 where rokerovka2.id not in(
select alfa2.id_new_name
from alfa2
where (alfa2.dat between :d1 and :d2)
) group by VID
...
Рейтинг: 0 / 0
Помогите с запросом
    #39981689
Фотография brick08
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekZ,
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
select
  sum( alfa.posit ) sum_of_posit,
  sum( alfa.summa ) sum_of_summa,
  alfa.dat, 
  rokerovka.category,
  rokerovka.vid 
from rokerovka
  left join alfa on (rokerovka.id = alfa.id_new_name) 
where (alfa.dat between :d1 and :d2)
  or alfa.dat is null
group by alfa.dat,rokerovka.category
order by alfa.dat
...
Рейтинг: 0 / 0
Помогите с запросом
    #39981691
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekZ,

Ну как-то так:
Код: sql
1.
2.
3.
4.
5.
select a.dat, r.category, r.vid, sum( a.posit ) sum_posit, sum( a.summa ) sum_summa from rokerovka r
  left join alfa a on a.id_new_name = r.id
  where a.dat between :d1 and :d2 or a.dat is null
  group by a.dat,  r.category, r.vid
  order by a.dat


Код: plaintext
1.
2.
3.
DAT	CATEGORY	VID	SUM_POSIT	SUM_SUMMA
		Техника		ТВ		
19.07.2020	Офисные товары	Бумага	3	1500
20.07.2020	Офисные товары	Бумага	2	1000

Если нужны именно '0' вместо 'null' то можно добавить coalesce().
...
Рейтинг: 0 / 0
Помогите с запросом
    #39981700
AlekZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
brick08 , alekcvp - так то да, но на продакшене получается ересь. Типо ТВ-ноль, потом дальше по списку видишь за этот период Тв-10 штук, например. Щас, дайте время сам переварю что пошло не так-отпишу. на тестовой базе(как в первом посте) все ок, там нет такого наполнения просто.
В любом случае спасибо, что указали как надо писать сей запрос.
...
Рейтинг: 0 / 0
Помогите с запросом
    #39981724
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekZ
Щас, дайте время сам переварю что пошло не так

Чтобы видеть "0" по датам необходимо откуда-то взять эту дату, чтобы потом к ней присоединять продажи...

Т.е. нужна будет ХП типа:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
create or alter procedure DATE_GEN (
    DFROM date not null,
    DTO date not null)
returns (
    CDATE date)
as
begin
  cdate = dfrom;
  while (cdate <= dto) do
  begin
    suspend;
    cdate = cdate + 1;
  end
end
...
Рейтинг: 0 / 0
Помогите с запросом
    #39981729
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Итоговый запрос:
Код: plsql
1.
2.
3.
4.
5.
select g.cdate, r.category, r.vid, sum( a.posit ) sum_posit, sum( a.summa ) sum_summa
  from rokerovka r right join date_gen(:d1, :d2) g on 1=1
  left join alfa a on a.id_new_name = r.id and a.dat = g.cdate
  group by g.cdate, r.category, r.vid
  order by g.cdate


CDATECATEGORYVIDSUM_POSITSUM_SUMMA19.07.2020Офисные товарыБумага3150019.07.2020ТехникаТВ 20.07.2020Офисные товарыБумага2100020.07.2020ТехникаТВ
...
Рейтинг: 0 / 0
Помогите с запросом
    #39981731
KreatorXXI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Свои пять копеек внесу. Зачем отображать нулевые продажи? Представьте у Вас список товаров несколько тысяч. Многих в наличии на складе нет давно. Зачем тащить эти нули? Если уж есть какие-то продажи конкретного товара за период и нужно отобразить некие нули, то Ваш запрос "простоват" для этого. И возможно лучше это сделать на клиенте. Реально Вы насилуете сервер, пытаясь получить несуществующие данные.
...
Рейтинг: 0 / 0
Помогите с запросом
    #39981734
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KreatorXXI,

Мне кажется этот вопрос надо задавать преподавателю
...
Рейтинг: 0 / 0
Помогите с запросом
    #39981752
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
where a.dat between :d1 and :d2 or a.dat is null

Не надо так писать.
...
Рейтинг: 0 / 0
Помогите с запросом
    #39981763
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WildSery
Код: sql
1.
where a.dat between :d1 and :d2 or a.dat is null

Не надо так писать.

А как надо?
...
Рейтинг: 0 / 0
Помогите с запросом
    #39981785
AlekZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот так, наверное
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
select rokerovka2.category,rokerovka2.vid,alfa2.posit from rokerovka2
inner join alfa2 on (rokerovka2.id = alfa2.id_new_name)
where (alfa2.dat between :d1 and :d2)
group by rokerovka2.category,rokerovka2.vid,alfa2.posit
UNION
select r2.CATEGORY,r2.VID,alfa2.posit from rokerovka2 r2
left join alfa2 on (r2.id = alfa2.id_new_name)
where r2.id not in(select a2.id_new_name
from alfa2 a2
where (a2.dat between :d1 and :d2)
) group by r2.CATEGORY,r2.VID,alfa2.posit



Если кто изящнее знает-напишите. А так вопрос решен. alfa2-это дубль alfa, тоже самое с рокеровкой, чтобы прод не мучить.
...
Рейтинг: 0 / 0
Помогите с запросом
    #39981788
KreatorXXI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp
KreatorXXI,

Мне кажется этот вопрос надо задавать преподавателю


Надо тогда посмотреть задание. В голове у неофита застрянут неправильные рекомендации. Потом их оттуда не вышибешь ничем.
...
Рейтинг: 0 / 0
Помогите с запросом
    #39981792
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp
А как надо?
В условие соединения выносить, а не в where костыли ставить.
...
Рейтинг: 0 / 0
Помогите с запросом
    #39981795
AlekZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У неофита в голове уже помойка, Вы лучше мне растолкуйте куда чего переносить.
А то на проде уже 5 минут запрос крутиться, да не выкрутиться :)
...
Рейтинг: 0 / 0
Помогите с запросом
    #39981797
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekZ
Вот так, наверное

И в чём смысл возвращаемого набора данных?

CATEGORY VIDPOSITОфисные товары Бумага2Офисные товары Бумага3ТехникаТВ
AlekZ
Вы лучше мне растолкуйте куда чего переносить.

Вот так не работает? (2 сообщения) 22170307
...
Рейтинг: 0 / 0
Помогите с запросом
    #39981801
KreatorXXI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekZ
Вот так, наверное
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
select rokerovka2.category,rokerovka2.vid,alfa2.posit from rokerovka2
inner join alfa2 on (rokerovka2.id = alfa2.id_new_name)
where (alfa2.dat between :d1 and :d2)
group by rokerovka2.category,rokerovka2.vid,alfa2.posit
UNION
select r2.CATEGORY,r2.VID,alfa2.posit from rokerovka2 r2
left join alfa2 on (r2.id = alfa2.id_new_name)
where r2.id not in(select a2.id_new_name
from alfa2 a2
where (a2.dat between :d1 and :d2)
) group by r2.CATEGORY,r2.VID,alfa2.posit



Если кто изящнее знает-напишите. А так вопрос решен. alfa2-это дубль alfa, тоже самое с рокеровкой, чтобы прод не мучить.


Второй запрос (после Union) вообще дурно попахивает. Вы посмотрите "Анализ плана" и "Анализ производительности".
...
Рейтинг: 0 / 0
Помогите с запросом
    #39981809
AlekZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alekcvp,
хранимку пока не создавал. В ФайрБирде с ними не работал, надо прогуглить куда ее тут сувать.
Меня напрягло то что на живой базе с Вашим запросом лезут и нули по некоторым позициям, по которым есть продажи. И не совсем своими мозгами понимаю как срабатывает условие "нулевой даты" (нет записи-значит DATE нулевая?).

А смысл-вернуть те строки по которым ноль продаж. У Вас там опечатка получилась в таблице-там в POSIT null у техники.


KreatorXXI,
10 минут выполняется...чуть модифицировал запустил еще раз. Жду :)

PLAN (ALFA NATURAL)
PLAN (ALFA NATURAL)
PLAN SORT (JOIN (ALFA NATURAL, ROKEROVKA INDEX (PK_ROKEROVKA)))
PLAN SORT (JOIN (R2 NATURAL, ALFA NATURAL))

-по мне это ругань чистой воды.
Non Indexed Reads ALFA - 977 304 192
...
Рейтинг: 0 / 0
Помогите с запросом
    #39981819
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekZ
alekcvp,
Меня напрягло то что на живой базе с Вашим запросом лезут и нули по некоторым позициям, по которым есть продажи.

Предыдущий запрос был не правильный, я переделал :)

P.S: Тестовые базы уже не в моде? Эксперименты на продакшене? О_о
AlekZ
хранимку пока не создавал. В ФайрБирде с ними не работал, надо прогуглить куда ее тут сувать.

Рекомендую IBExpert 1883929
...
Рейтинг: 0 / 0
Помогите с запросом
    #39981823
KreatorXXI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekZ

PLAN (ALFA NATURAL)
PLAN (ALFA NATURAL)
PLAN SORT (JOIN (ALFA NATURAL, ROKEROVKA INDEX (PK_ROKEROVKA)))
PLAN SORT (JOIN (R2 NATURAL, ALFA NATURAL))

-по мне это ругань чистой воды.
Non Indexed Reads ALFA - 977 304 192


Может, действительно, книжки какие для начала почитать? У Вас план по "натуралу". Это значит, что не используются никакие индексы. Плюс ещё идёт перемножение таблиц. 10 минут - это ещё хорошо при таком раскладе. Индексы по датам хоть есть?

Я бы оставил в конце концов один из первых Ваших запросов. Таблица alfа должна отрабатываться по индексу с датой, а вторая таблица (боюсь её название даже писать) должна быть связана по inner join (inner можно не писать). Нули добивайте на клиенте.
...
Рейтинг: 0 / 0
Помогите с запросом
    #39981825
AlekZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alekcvp, я как раз в ИБЭксперте и сижу. Для ОгоньПтицы по-моему других админок то и нету :)
Ну ладно, я запустил Ваш "Итоговый запрос:" -не знаю , то или не то. Но пока 5 минут и тухляк (все еще выполняется) :)
Прод такой-его не жалко. Его использую я и еще 1 человек, для которого весь этот огород и делался.
Был бы прод который нельзя трогать-была бы нормальная инфраструктура/норм зарплата/ и норм специалист который такие вопросы по форумам не задает (тут я ушел плакать в дальний угол).
...
Рейтинг: 0 / 0
Помогите с запросом
    #39981828
AlekZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
KreatorXXI, может и книги почитать. А зачем индексация по датам? Какие плюсы?
Ткните на дельную книгу или статью. Я не ДБА (когда-то хотел им стать), но у нас не нужны ученики. так прочитаю-но через 2 года забуду.
и когда поле дата было ключевым? Или индекс и ключ не одно и тоже?
...
Рейтинг: 0 / 0
25 сообщений из 49, страница 1 из 2
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Помогите с запросом
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]