Форум OlegON > Компьютеры и Программное обеспечение > Операционные системы и программное обеспечение > Oracle

Помогите с запросом на количество дней за период, в которые остаток товара был >0 : Oracle

18.04.2024 19:55


28.09.2006 15:02
reddevil
 
Цитата:
olegon
Цитата:
reddevil как нефиг делать 80 магаз и 90K ассортимент там же макросы они сами все за любой период обновляют
В Excel ограничение на кол-во ячеек 65535, я не прав? Или их в несколько столбиков?
да не парься, задача то не та, в екселе у них нулевые остатки на дату хранться и не по всему асс-ту а по номенклатуре.
28.09.2006 15:03
Mtirt
 
Цитата:
olegon Может все таки завести тогда задание на заполнение таблицы по остаткам ежедневно, снимая их на 23.59 по SMGOODS? Это много где еще можно будет использовать, хотя расти она будет, конечно...
ЕЕ еще и обновлять задним числом надо.
Документы иногда задним числом меняются.
А это уже "веселая" математика...
28.09.2006 15:08
Mtirt
 
В общем так. Что-то нарисовалось.
Пока без особых изысков. Прошу потестить сказать, где я могу быть не права...
Код:
select storeloc,article, count(*) from(
select storeloc,article,sum(qu) over (partition by storeloc,article order by dt desc range unbounded preceding) ost, dt from(
select storeloc,article,sum(quantity) qu, dt from(
select t.storeloc, t.article, t.quantity, to_date(sysdate) dt from smgoods t
union all
select d.locationto, a.article, -a.quantity, d.createdat dt from smspec a, smdocuments d
where a.doctype=d.doctype
      and a.docid=d.id
      and d.createdat between :DateStart and sysdate
      and d.docstate>=2
      and d.opcode in (0,3,9,13,18)
union all
select d.locationfrom, a.article, a.quantity, d.createdat dt from smspec a, smdocuments d
where a.doctype=d.doctype
      and a.docid=d.id
      and d.createdat between &DateStart and sysdate
      and d.docstate>=2
      and d.opcode in (1,2,7,8,12)
union all
select c.id storeLoc, b.article Article,0 quantity,a.dt dt
from dates a,smcard b,smstorelocations c
where a.dt between :DateStart and sysdate
      and c.id<>-1)
group by storeloc,article, dt)
) 
where ost<=0     
group by storeloc, article
28.09.2006 15:09
Mtirt
 
Да. там табличка используется не супермажная, все время про нее забываю.
Код:
create table DATES
(
  DT DATE
)
tablespace USERS
  pctfree 10
  pctused 40
  initrans 1
  maxtrans 255
  storage
  (
    initial 64K
    minextents 1
    maxextents unlimited
  );

 insert into dates(dt) select to_date('01.01.2006')+rownum from all_objects where rownum < 366);
Просто подряд даты за все дни года...
28.09.2006 15:39
OlegON
 
Код:
and d.createdat between &DateStart and sysdate
хм, опечаталась? как оно работает-то?
28.09.2006 15:42
OlegON
 
Кстати, кто-нибудь сравнивал, что быстрее,
Код:
opcode in (1,2,3,4,5,6)
или
Код:
opcode=1 or opcode=2 or opcode=3 or opcode=4 or opcode=5 or opcode=6
?
28.09.2006 15:47
Mtirt
 
Цитата:
olegon
Код:
and d.createdat between &DateStart and sysdate
хм, опечаталась? как оно работает-то?
Мой PL/SQL developer такое съедает нормально.
Для отчета поправлю....
28.09.2006 16:17
Mtirt
 
Вот так ближе к истине.
Запрос по группе классификатора за август 2006 года - 42 секунды.
Если есть предложения по отпимизации - готова услышать...
Код:
select storeloc,article, count(*) from(
select storeloc,q.article,sum(qu) over (partition by storeloc,q.article order by dt desc range unbounded preceding) ost, dt from(
select storeloc,article,sum(quantity) qu, dt from(
select t.storeloc, t.article, t.quantity, to_date(sysdate) dt from smgoods t, smcard m, sacardclass y
where t.article=m.article
      and y.id=m.idclass
      and y.tree like CONCAT(&Group,'%')
union all
select d.locationto, a.article, -a.quantity, d.createdat dt from smspec a, smdocuments d, smcard m, sacardclass y
where a.doctype=d.doctype
      and a.docid=d.id
      and d.createdat between to_date(&DateStart) and to_date(sysdate)
      and d.docstate>=2
      and d.opcode in (0,3,9,13,18)
      and a.article=m.article
      and y.id=m.idclass
      and y.tree like CONCAT(&Group,'%')
union all
select d.locationfrom, a.article, a.quantity, d.createdat dt from smspec a, smdocuments d, smcard m, sacardclass y
where a.doctype=d.doctype
      and a.docid=d.id
      and d.createdat between to_date(&DateStart) and to_date(sysdate)
      and d.docstate>=2
      and d.opcode in (1,2,7,8,12)
      and a.article=m.article
      and y.id=m.idclass
      and y.tree like CONCAT(&Group,'%')
union all
select c.id storeLoc, b.article Article,0 quantity,a.dt dt
from dates a,smcard b,smstorelocations c, sacardclass y
where a.dt between to_date(&DateStart) and to_date(sysdate)
      and b.idclass=y.id
      and y.tree like CONCAT(&Group,'%')
      and c.id<>-1)
group by storeloc,article, dt) q
) 
where ost>0 
and dt between to_date(&dateStart) and to_date(&DateEnd)    
group by storeloc, article
29.09.2006 06:09
reddevil
 
преждлжение № раз
Код:
select t.storeloc, t.article, t.quantity, to_date(sysdate) dt from smgoods t, smcard m, sacardclass y 
where t.article=m.article 
      and y.id=m.idclass 
      and y.tree like CONCAT(&Group,'%') 
union all 
select d.locationto, a.article, -a.quantity, d.createdat dt from smspec a, smdocuments d, smcard m, sacardclass y 
where a.doctype=d.doctype 
      and a.docid=d.id 
      and d.createdat between to_date(&DateStart) and to_date(sysdate) 
      and d.docstate>=2 
      and d.opcode in (0,3,9,13,18) 
      and a.article=m.article 
      and y.id=m.idclass 
      and y.tree like CONCAT(&Group,'%') 
union all 
select d.locationfrom, a.article, a.quantity, d.createdat dt from smspec a, smdocuments d, smcard m, sacardclass y 
where a.doctype=d.doctype 
      and a.docid=d.id 
      and d.createdat between to_date(&DateStart) and to_date(sysdate) 
      and d.docstate>=2 
      and d.opcode in (1,2,7,8,12) 
      and a.article=m.article 
      and y.id=m.idclass 
      and y.tree like CONCAT(&Group,'%')
этот блок переписать без union - воспользоваться DECODE(мх-в, мх-из)

предложение 2
Код:
over (partition by storeloc,q.article order by dt desc range unbounded preceding)
- судя по этому у тебя 9i значит таблицу dates можно заменить на потоковую функцию.

Код:
create or replace package pivot as
type date_range_tbl is table of date;
function gen_range(start_date date, end_date date) return date_range_tbl pipelined;
end;
/

create or replace package body pivot as
  function gen_range(start_date date, end_date date) return date_range_tbl
  pipelined
  is
    cur_date date;
  begin

    cur_date := trunc(start_date);
    while (cur_date <= trunc(end_date))
    loop
      pipe row(cur_date);

      cur_date := cur_date + 1;
    end loop;
    return;

  end;
end;
/



select 
 t.column_value
from table(pivot.gen_range('01.06.2006', '31.08.2006'))  t
если нет то таблицу dates наверно надо создать как GLOBAL TEMPORARY чтоб у пользователей могли быть разные интервалы
29.09.2006 06:54
Mtirt
 
Первое принимаю. Сейчас сделаю.
Второе - 8-ка. Аналитические функции там тоже работают.
И табличку я просто и тупо создала один раз. Я ее еще где-то в отчетах использую.
Часовой пояс GMT +3, время: 19:55.

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