powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / for select into do select
25 сообщений из 28, страница 1 из 2
for select into do select
    #39377474
RoboTehnik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Подскажите пожалуйста как мне реализовать запрос. В таблице есть поля с датой документа и датой выгрузки. Даты в них могут быть разные для каждой записи. Нужно для вчерашней даты выгрузки сформировать реестр документов по датам.

Такой запрос работает очень долго
Код: plsql
1.
2.
3.
4.
5.
6.
select 
  t.date_doc, 
  sum(t.sum_doc) 
from table t
where t.date_doc in (select t.date_doc from table t where t.sent_date>=dateadd(day, -1, CURRENT_DATE and t.sent_date<CURRENT_DATE )
group by 1;



А такой выдает сообщение об ошибке
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
set term ^;

execute block as
declare variable doc_date_in date;

begin
  for select 
    t.date_doc
  from table t
  where t.sent_date>=dateadd(day, -1, CURRENT_DATE and t.sent_date<CURRENT_DATE 
  into :doc_date_in do
    select 
      t.date_doc,
      sum(t.sum_doc)
    from table t
    where t.date_doc=:doc_date_in
    group by 1;
end^

set term ;^
...
Рейтинг: 0 / 0
for select into do select
    #39377476
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Табличку-то покажи.

Индекс по дате есть?
...
Рейтинг: 0 / 0
for select into do select
    #39377504
Граур Станислав
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RoboTehnikПодскажите пожалуйста как мне реализовать запрос. В таблице есть поля с датой документа и датой выгрузки. Даты в них могут быть разные для каждой записи. Нужно для вчерашней даты выгрузки сформировать реестр документов по датам.

Такой запрос работает очень долго
Код: plsql
1.
2.
3.
4.
5.
6.
select 
  t.date_doc, 
  sum(t.sum_doc) 
from table t
where t.date_doc in (select t.date_doc from table t where t.sent_date>=dateadd(day, -1, CURRENT_DATE and t.sent_date<CURRENT_DATE )
group by 1;





В результат запроса попадут не документы выгруженные вчера, а документы у которых date_doc совпадает с датой документов выгруженных вчера. В приведенном запросе не хватает скобки ")" в функции dateadd.
...
Рейтинг: 0 / 0
for select into do select
    #39377509
m7m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RoboTehnik,

а чем просто

Код: sql
1.
2.
3.
4.
5.
select T.Date_Doc, sum(T.Sum_Doc)
  from table T
  where T.Sent_Date >= dateadd(day, -1, current_date)
    and T.Sent_Date < current_date
  group by 1  


не угодил?

И таки да желателен индекс по Sent_Date
...
Рейтинг: 0 / 0
for select into do select
    #39377522
KreatorXXI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть оператор between вместо "больше" и "меньше", красивее запрос получается. А если нужен только один день, то банально можно использовать "равно".
...
Рейтинг: 0 / 0
for select into do select
    #39377532
stelvic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
m7mRoboTehnik,

а чем просто

Код: sql
1.
2.
3.
4.
5.
select T.Date_Doc, sum(T.Sum_Doc)
  from table T
  where T.Sent_Date >= dateadd(day, -1, current_date)
    and T.Sent_Date < current_date
  group by 1  


не угодил?

И таки да желателен индекс по Sent_Date

Да. Автор топика немеряно усложнил запрос. А если Sent_Date - типа date, то where и вовсе в данном случае уменьшается до
Код: sql
1.
T.Sent_Date = dateadd(day, -1, current_date)
...
Рейтинг: 0 / 0
for select into do select
    #39377533
KreatorXXI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KreatorXXI,

Опять же можно не заморачиваться с функцией dateadd, а писать проще - (current_date-1). Гуру могут поправить, если это концептуально не правильно.
...
Рейтинг: 0 / 0
for select into do select
    #39377535
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hello, Kreatorxxi!
You wrote on 29 декабря 2016 г. 12:29:22:

Kreatorxxi> Есть оператор between вместо "больше" и "меньше",BETWEEN это >= <=

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
for select into do select
    #39377548
RoboTehnik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
wadman,

Да, индекс есть по обоим датам. Всю таблицу я показать конечно же не могу, в ней немногим более 43 млн записей. Таблица ниже поможет представить правильно суть задачи.

date_doc; sent_date; sum;28.12.2016;28.12.2016 18:05;1028.12.2016;28.12.2016 18:05;1528.12.2016;28.12.2016 18:05;527.12.2016;28.12.2016 18:05;327.12.2016;28.12.2016 18:05;1627.12.2016;28.12.2016 18:05;1826.12.2016;28.12.2016 18:05;226.12.2016;28.12.2016 18:05;726.12.2016;28.12.2016 18:05;1125.12.2016;28.12.2016 18:05;17

В итоге, должен получиться такой отчет
date_doc; sum28.12.2016;3027.12.2016;1826.12.2016;2025.12.2016;17

Меня больше интересует второй вариант решения, он как мне кажется наименее ресурсоемкий. Почему после do нельзя вписать еще один select?
...
Рейтинг: 0 / 0
for select into do select
    #39377550
stelvic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot Граур Станислав]RoboTehnikВ результат запроса попадут не документы выгруженные вчера, а документы у которых date_doc совпадает с датой документов выгруженных вчера. В приведенном запросе не хватает скобки ")" в функции dateadd.
Кстати да, поначалу не сообразил, что условие вообще не верно. Если есть документы с date_doc удовлетворящим условию, но при этом sent_date совершенно другим, они тоже попадут в выборку. Если со скобками разобраться. :)
...
Рейтинг: 0 / 0
for select into do select
    #39377551
KreatorXXI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящий,

Правильно. Я к тому, чтобы убрать типа вот такое:
Код: sql
1.
  t.sent_date>='2016-12-01' and t.sent_date<'2017-01-01'


Логичней:
Код: sql
1.
  t.sent_date between '2016-12-01' and '2016-31-12'
...
Рейтинг: 0 / 0
for select into do select
    #39377552
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RoboTehnikВсю таблицу я показать конечно же не могу, в ней немногим более 43 млн записей.
Не содержимое, а DDL (полное описание таблицы).
RoboTehnikМеня больше интересует второй вариант решения, он как мне кажется наименее ресурсоемкий.
20059782
...
Рейтинг: 0 / 0
for select into do select
    #39377553
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KreatorXXIЛогичней:
Не логичней, ибо
KreatorXXI
Код: sql
1.
'2016-31-12'


это уже следующие сутки.
...
Рейтинг: 0 / 0
for select into do select
    #39377554
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RoboTehnikПочему после do нельзя вписать еще один select?
можно, только он должен куда-то возвращать данные (into...).
RoboTehnikА такой выдает сообщение об ошибке
заклинаю, никогда не пишите такой текст без приведения точного сообщения об ошибке. Сэкономит массу времени и вам, и отвечающим.
...
Рейтинг: 0 / 0
for select into do select
    #39377556
RoboTehnik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Граур Станислав
В результат запроса попадут не документы выгруженные вчера, а документы у которых date_doc совпадает с датой документов выгруженных вчера. В приведенном запросе не хватает скобки ")" в функции dateadd.

Спасибо за замечание по скобке, я после публикации сообщения не нашел, как его исправить.
Действительно, мне нужны не документы выгруженные вчера, а суммы документов, у которых date_doc совпадает с датой документов выгруженных вчера.
...
Рейтинг: 0 / 0
for select into do select
    #39377564
RoboTehnik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
МимопроходящийHello, Kreatorxxi!
You wrote on 29 декабря 2016 г. 12:29:22:

Kreatorxxi> Есть оператор between вместо "больше" и "меньше",BETWEEN это >= <=



Спасибо за подсказку, не ожидал, столь оперативных ответов.
...
Рейтинг: 0 / 0
for select into do select
    #39377573
m7m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RoboTehnikДа, индекс есть по обоим датам. Всю таблицу я показать конечно же не могу, в ней немногим более 43 млн записей. Таблица ниже поможет представить правильно суть задачи.
RoboTehnik мне нужны не документы выгруженные вчера, а суммы документов, у которых date_doc совпадает с датой документов выгруженных вчера.

А если вот так
date_doc; sent_date; sum;28.12.2016;28.12.2016 18:05;1028.12.2016;28.12.2016 18:05;1528.12.2016;28.12.2016 18:05;527.12.2016;28.12.2016 18:05;327.12.2016;28.12.2016 18:05;1627.12.2016;28.12.2016 18:05;1826.12.2016;28.12.2016 18:05;226.12.2016;28.12.2016 18:05;726.12.2016;28.12.2016 18:05;1125.12.2016;28.12.2016 18:05;1725.12.2016;27.12.2016 18:05;10

Что должно быть в итоге???
date_doc; sum28.12.2016;3027.12.2016;1826.12.2016;2025.12.2016;17
или
date_doc; sum28.12.2016;3027.12.2016;1826.12.2016;2025.12.2016;27
...
Рейтинг: 0 / 0
for select into do select
    #39377577
Граур Станислав
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RoboTehnikСпасибо за замечание по скобке, я после публикации сообщения не нашел, как его исправить.
Действительно, мне нужны не документы выгруженные вчера, а суммы документов, у которых date_doc совпадает с датой документов выгруженных вчера.

В таком случае из таблицы
date_doc; sent_date; sum;28.12.2016;28.12.2016 18:05;1028.12.2016;28.12.2016 18:05;1528.12.2016;28.12.2016 18:05;527.12.2016;28.12.2016 18:05;327.12.2016;28.12.2016 18:05;1627.12.2016;28.12.2016 18:05;1826.12.2016;28.12.2016 18:05;226.12.2016;28.12.2016 18:05;726.12.2016;28.12.2016 18:05;1125.12.2016;28.12.2016 18:05;1721.12.2016;28.12.2016 18:05;1621.12.2016;22.12.2016 18:05;15

в вашу сводку попадет и последний документ от 21.12.2016, выгруженный 22.12.2016.
Это будет правильно ?
...
Рейтинг: 0 / 0
for select into do select
    #39377581
stelvic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RoboTehnikСпасибо за замечание по скобке, я после публикации сообщения не нашел, как его исправить.
Действительно, мне нужны не документы выгруженные вчера, а суммы документов, у которых date_doc совпадает с датой документов выгруженных вчера.
Тогда понятно. Так и надо было говорить сразу. Можно и execute block. Но тогда нужно объявлять, что он что-то возвращает. Внутренний селект должен класть куда-то значения, т.е. into тоже должен быть. И должен быть suspend.
...
Рейтинг: 0 / 0
for select into do select
    #39377588
RoboTehnik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
m7mRoboTehnikДа, индекс есть по обоим датам. Всю таблицу я показать конечно же не могу, в ней немногим более 43 млн записей. Таблица ниже поможет представить правильно суть задачи.
RoboTehnik мне нужны не документы выгруженные вчера, а суммы документов, у которых date_doc совпадает с датой документов выгруженных вчера.

А если вот так
date_doc; sent_date; sum;28.12.2016;28.12.2016 18:05;1028.12.2016;28.12.2016 18:05;1528.12.2016;28.12.2016 18:05;527.12.2016;28.12.2016 18:05;327.12.2016;28.12.2016 18:05;1627.12.2016;28.12.2016 18:05;1826.12.2016;28.12.2016 18:05;226.12.2016;28.12.2016 18:05;726.12.2016;28.12.2016 18:05;1125.12.2016;28.12.2016 18:05;1725.12.2016;27.12.2016 18:05;10

Что должно быть в итоге???
date_doc; sum28.12.2016;3027.12.2016;1826.12.2016;2025.12.2016;17
или
date_doc; sum28.12.2016;3027.12.2016;1826.12.2016;2025.12.2016;27

В итоге должна получиться сумма документов за 25 декабря. То есть вторая таблица верна.
...
Рейтинг: 0 / 0
for select into do select
    #39377591
RoboTehnik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Граур СтаниславRoboTehnikСпасибо за замечание по скобке, я после публикации сообщения не нашел, как его исправить.
Действительно, мне нужны не документы выгруженные вчера, а суммы документов, у которых date_doc совпадает с датой документов выгруженных вчера.

В таком случае из таблицы
date_doc; sent_date; sum;28.12.2016;28.12.2016 18:05;1028.12.2016;28.12.2016 18:05;1528.12.2016;28.12.2016 18:05;527.12.2016;28.12.2016 18:05;327.12.2016;28.12.2016 18:05;1627.12.2016;28.12.2016 18:05;1826.12.2016;28.12.2016 18:05;226.12.2016;28.12.2016 18:05;726.12.2016;28.12.2016 18:05;1125.12.2016;28.12.2016 18:05;1721.12.2016;28.12.2016 18:05;1621.12.2016;22.12.2016 18:05;15

в вашу сводку попадет и последний документ от 21.12.2016, выгруженный 22.12.2016.
Это будет правильно ?

Да, это будет правильно.
...
Рейтинг: 0 / 0
for select into do select
    #39377610
RoboTehnik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
stelvicRoboTehnikСпасибо за замечание по скобке, я после публикации сообщения не нашел, как его исправить.
Действительно, мне нужны не документы выгруженные вчера, а суммы документов, у которых date_doc совпадает с датой документов выгруженных вчера.
Тогда понятно. Так и надо было говорить сразу. Можно и execute block. Но тогда нужно объявлять, что он что-то возвращает. Внутренний селект должен класть куда-то значения, т.е. into тоже должен быть. И должен быть suspend.

Вот с этого места поподробнее пожалуйста, можно небольшой примерчик?
...
Рейтинг: 0 / 0
for select into do select
    #39377612
stelvic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
set term ^;

execute block returns (DD Date, S float)
as
declare variable doc_date_in date;

begin
  for select distinct
    t.date_doc
  from table t
  where t.sent_date>=dateadd(day, -1, CURRENT_DATE and t.sent_date<CURRENT_DATE 
  into :doc_date_in do
    select 
      t.date_doc,
      sum(t.sum_doc)
    from table t
    where t.date_doc=:doc_date_in
    into :DD, :S do
    suspend
end^

set term ;^


Как-то так. Не уверен, что без ошибок. Проверить негде
...
Рейтинг: 0 / 0
for select into do select
    #39377614
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
процедуру пиши.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
for select into do select
    #39377691
RoboTehnik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
stelvic,

Спасибо всем.
Заработало как надо и ощутимо быстрее.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
set term ^;

execute block returns (DD Date, S float) as
declare variable doc_date_in date;

begin
  for select t.date_doc from table t
  where t.sent_date between dateadd(day, -1, CURRENT_DATE) and CURRENT_DATE
  group by 1
  into :doc_date_in do
    for select
      t.date_doc,
      sum(t.sum_doc)
    from table t
    where t.date_doc=:doc_date_in
    group by 1
    into :DD, :S do
    suspend;
end^

set term ;^
...
Рейтинг: 0 / 0
25 сообщений из 28, страница 1 из 2
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / for select into do select
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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