Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Помогите оптимизировать запрос / 25 сообщений из 54, страница 1 из 3
07.12.2017, 10:28
    #39565607
lYY
lYY
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос
Есть запрос для отчета сверки:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
select 
 a1.mag,
 sum(a1.prih_do)+sum(a1.vozv_do)-sum(a1.rash_do)-sum(a1.prod_do)-sum(a1.rash_vper)+sum(a1.prih_vper)-sum(a1.prod_vper)+sum(a1.vozv_vper) ostss
from
(select 
  decode(f.salelocationfrom,-2,f.salelocationto,f.salelocationfrom) mag,
  case when f.saledate<to_date('01.11.2017','DD.MM.YYYY') then
   sum(decode(f.saletype,'WO',f.primecost,0)) else 0 end rash_do,
  case when f.saledate<to_date('01.11.2017','DD.MM.YYYY') then
   sum(decode(f.saletype,'WI',f.primecost,0)) else 0 end prih_do,
  case when f.saledate<to_date('01.11.2017','DD.MM.YYYY') then
   sum(decode(f.saletype,'CS',f.primecost,0)) else 0 end prod_do,
  case when f.saledate<to_date('01.11.2017','DD.MM.YYYY') then
   sum(decode(f.saletype,'CR',f.primecost,0)) else 0 end vozv_do,
  case when f.saledate between to_date('01.11.2017','DD.MM.YYYY') and to_date('30.11.2017','DD.MM.YYYY') then
   sum(decode(f.saletype,'WO',f.primecost,0)) else 0 end rash_vper,
  case when f.saledate between to_date('01.11.2017','DD.MM.YYYY') and to_date('30.11.2017','DD.MM.YYYY') then
   sum(decode(f.saletype,'WI',f.primecost,0)) else 0 end prih_vper,
  case when f.saledate between to_date('01.11.2017','DD.MM.YYYY') and to_date('30.11.2017','DD.MM.YYYY') then
   sum(decode(f.saletype,'CS',f.primecost,0)) else 0 end prod_vper,
  case when f.saledate between to_date('01.11.2017','DD.MM.YYYY') and to_date('30.11.2017','DD.MM.YYYY') 
  then sum(decode(f.saletype,'CR',f.primecost,0)) else 0 end vozv_vper,
  case when f.saledate between to_date('01.11.2017','DD.MM.YYYY') and to_date('30.11.2017','DD.MM.YYYY') then
   sum(decode(f.saletype,'CS',f.salesum,0)) else 0 end prod_vper3,
  case when f.saledate between to_date('01.11.2017','DD.MM.YYYY') and to_date('30.11.2017','DD.MM.YYYY') 
  then  sum(decode(f.saletype,'CR',f.salesum,0)) else 0 end vozv_vper3
from supermag.ffmaprep f
where f.rectype=1
 and f.saledate<=to_date('30.11.2017','DD.MM.YYYY')
 and decode(f.salelocationfrom,-2,f.salelocationto,f.salelocationfrom) in (111,112,120,121,122)
group by decode(f.salelocationfrom,-2,f.salelocationto,f.salelocationfrom), f.saledate) a1
group by a1.mag


Суммирует себестоимость за месяц и остатки за весь период по магазинам 111,112,120,121,122
Выполняется полным сканированием таблицы.
Таблица supermag.ffmaprep гигов десять.
Запрос выполняется минут 10 (диски ssd)
Можно как-то с помощью аналитических функций или других способов оптимизировать запрос?
(Oracle 10g)
...
Рейтинг: 0 / 0
07.12.2017, 11:25
    #39565658
Помогите оптимизировать запрос
lYY,

запрос у тебя линейный. там оптимизировать совершенно нечего. тут, скорее, подход к получению нужных данных надо менять, а не запрос оптимизировать...
...
Рейтинг: 0 / 0
07.12.2017, 11:31
    #39565670
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос
lYYпо магазинам 111,112,120,121,122Какой это процент от всех данных?
...
Рейтинг: 0 / 0
07.12.2017, 11:32
    #39565671
dbms_photoshop
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос
Добрый Э - ЭхlYY,

запрос у тебя линейный. там оптимизировать совершенно нечего. тут, скорее, подход к получению нужных данных надо менять, а не запрос оптимизировать...Ну если он уходит в темп, то оптимизировать есть чего.
10 гигов за 10 минут на SSD это что-то не вполне адекватное.
...
Рейтинг: 0 / 0
07.12.2017, 11:33
    #39565673
lYY
lYY
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос
EliclYYпо магазинам 111,112,120,121,122Какой это процент от всех данных?
там может быть любой список магазинов
...
Рейтинг: 0 / 0
07.12.2017, 11:35
    #39565678
lYY
lYY
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос
dbms_photoshop10 гигов за 10 минут на SSD это что-то не вполне адекватное.
да, странно это
...
Рейтинг: 0 / 0
07.12.2017, 11:38
    #39565683
lYY
lYY
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос
Добрый Э - ЭхlYY,

запрос у тебя линейный. там оптимизировать совершенно нечего. тут, скорее, подход к получению нужных данных надо менять, а не запрос оптимизировать...
Тут как обычно всё. Разработчики написали эту хрень, которая забивает весь ввод-вывод и им плевать. А с меня пользователи спрашивают, почему сервер тормозит?!
...
Рейтинг: 0 / 0
07.12.2017, 11:46
    #39565693
Dshedoo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос
Я бы предложил агрегировать данные на ежемесячной основе.
Затем уже выбирать из этих данных необходимые + месяц из supermag.ffmaprep

З.Ы.
Код: plsql
1.
f.saledate between to_date('01.11.2017','DD.MM.YYYY') and to_date('30.11.2017','DD.MM.YYYY')


=
Код: plsql
1.
2.
f.saledate >= to_date('01.11.2017','DD.MM.YYYY')
where f.saledate<=to_date('30.11.2017','DD.MM.YYYY')
...
Рейтинг: 0 / 0
07.12.2017, 11:51
    #39565699
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос
lYY,

смотреть индексы какие есть, мож придется декоде переписать

или скажем для
'WI','CS','CR' тож раз посчитать на начало года

нет f.saledate>= поетому беда

.....
stax
...
Рейтинг: 0 / 0
07.12.2017, 11:52
    #39565701
lYY
lYY
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос
Dshedoo,

подумаем.

Уточнил объем таблицы, 48 Гб, 275 миллионов строк.
...
Рейтинг: 0 / 0
07.12.2017, 11:55
    #39565705
lYY
lYY
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос
индексы
Код: plsql
1.
2.
3.
4.
5.
6.
create index SUPERMAG.FFMAPREP_ARTICLE on SUPERMAG.FFMAPREP (ARTICLE)
create index SUPERMAG.FFMAPREP_DOC on SUPERMAG.FFMAPREP (SALEID, SALETYPE, SALESPECITEM)
create index SUPERMAG.FFMAPREP_LOCFROM on SUPERMAG.FFMAPREP (SALELOCATIONFROM, SALEDATE)
create index SUPERMAG.FFMAPREP_LOCTO on SUPERMAG.FFMAPREP (SALELOCATIONTO, SALEDATE)
create index SUPERMAG.FFMAPREP_SALEDATE on SUPERMAG.FFMAPREP (SALEDATE)
create index SUPERMAG.FFMAPREP_SUPPLIER on SUPERMAG.FFMAPREP (INCOMECLIENTINDEX)
...
Рейтинг: 0 / 0
07.12.2017, 12:08
    #39565723
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос
lYYиндексы
Код: plsql
1.
2.
3.
4.
5.
6.
create index SUPERMAG.FFMAPREP_ARTICLE on SUPERMAG.FFMAPREP (ARTICLE)
create index SUPERMAG.FFMAPREP_DOC on SUPERMAG.FFMAPREP (SALEID, SALETYPE, SALESPECITEM)
create index SUPERMAG.FFMAPREP_LOCFROM on SUPERMAG.FFMAPREP (SALELOCATIONFROM, SALEDATE)
create index SUPERMAG.FFMAPREP_LOCTO on SUPERMAG.FFMAPREP (SALELOCATIONTO, SALEDATE)
create index SUPERMAG.FFMAPREP_SALEDATE on SUPERMAG.FFMAPREP (SALEDATE)
create index SUPERMAG.FFMAPREP_SUPPLIER on SUPERMAG.FFMAPREP (INCOMECLIENTINDEX)



убрать decode(f.salelocationfrom,-2,f.salelocationto,f.salelocationfrom)

считать отдельно для f.salelocationfrom=-2 in f.salelocationto (...
union all
f.salelocationfrom<>-2 in f.salelocationfrom (...


ps
автор BETWEEN

Оптимизатор всегда заменяет условие, использующее оператор
сравнения BETWEEN, эквивалентным условием, использующим
операторы сравнения <= и >=. Например, оптимизатор заменяет
первое из двух следующих условий на второе:

sal BETWEEN 2000 AND 3000

sal >= 2000 AND sal <= 3000


.....
stax
...
Рейтинг: 0 / 0
07.12.2017, 12:14
    #39565732
dbms_photoshop
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос
lYYdbms_photoshop10 гигов за 10 минут на SSD это что-то не вполне адекватное.
да, странно этоВерсия какая?
Приложи в спойлер вывод
Код: plaintext
select dbms_sqltune.report_sql_monitor('твой SQL ID') from dual
...
Рейтинг: 0 / 0
07.12.2017, 12:36
    #39565748
Dshedoo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
select 
 a1.mag,
 sum(a1.prih_do+a1.vozv_do-a1.rash_do-a1.prod_do-a1.rash_vper+a1.prih_vper-a1.prod_vper+a1.vozv_vper) ostss
from
(select 
  case when f.salelocationfrom = -2 then f.salelocationto else f.salelocationfrom end mag,
  case when f.saledate<to_date('01.11.2017','DD.MM.YYYY') and f.saletype = 'WO'
    then sum(f.primecost) else 0 end rash_do,
  case when f.saledate<to_date('01.11.2017','DD.MM.YYYY') and f.saletype = 'WI'
    then sum(f.primecost) else 0 end prih_do,   
  case when f.saledate<to_date('01.11.2017','DD.MM.YYYY') and f.saletype = 'CS'
    then sum(f.primecost) else 0 end prod_do,   
  case when f.saledate<to_date('01.11.2017','DD.MM.YYYY') and f.saletype = 'CR'
    then sum(f.primecost) else 0 end vozv_do,   
  case when f.saledate >= to_date('01.11.2017','DD.MM.YYYY') and f.saletype = 'WO'
    then sum(f.primecost) else 0 end rash_vper,   
  case when f.saledate >= to_date('01.11.2017','DD.MM.YYYY') and f.saletype = 'WI'
    then sum(f.primecost) else 0 end prih_vper,   
  case when f.saledate >= to_date('01.11.2017','DD.MM.YYYY') and f.saletype = 'CS'
    then sum(f.primecost) else 0 end prod_vper,   
  case when f.saledate >= to_date('01.11.2017','DD.MM.YYYY') and f.saletype = 'CR'
    then sum(f.primecost) else 0 end vozv_vper,    
  case when f.saledate >= to_date('01.11.2017','DD.MM.YYYY') and f.saletype = 'CS'
    then sum(f.salesum) else 0 end prod_vper3,   
  case when f.saledate >= to_date('01.11.2017','DD.MM.YYYY') and f.saletype = 'CR'
    then sum(f.salesum) else 0 end vozv_vper3    
from supermag.ffmaprep f
where f.rectype=1
 and f.saledate<=to_date('30.11.2017','DD.MM.YYYY')
 and f.saletype in ('WO','WI','CS','CR')
 and --case when f.salelocationfrom = -2 then f.salelocationto else f.salelocationfrom end in (111,112,120,121,122)
     (
      (f.salelocationfrom = -2 and f.salelocationto in (111,112,120,121,122))
     or
      (f.salelocationfrom != -2 and f.salelocationfrom in (111,112,120,121,122))
      )
      
group by case when f.salelocationfrom = -2 then f.salelocationto else f.salelocationfrom end, f.saledate) a1
group by a1.mag
...
Рейтинг: 0 / 0
07.12.2017, 12:51
    #39565771
Dshedoo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос
Dshedoo
Код: plsql
1.
2.
3.
4.
5.
     (
      (f.salelocationfrom = -2 and f.salelocationto in (111,112,120,121,122))
     or
      (f.salelocationfrom != -2 and f.salelocationfrom in (111,112,120,121,122))
      )



Dshedoo
Код: plsql
1.
2.
3.
4.
5.
     (
      (f.salelocationfrom = -2 and f.salelocationto in (111,112,120,121,122))
     or
      (f.salelocationfrom in (111,112,120,121,122))
      )
...
Рейтинг: 0 / 0
07.12.2017, 13:28
    #39565810
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос
DshedooDshedoo
Код: plsql
1.
2.
3.
4.
5.
     (
      (f.salelocationfrom = -2 and f.salelocationto in (111,112,120,121,122))
     or
      (f.salelocationfrom in (111,112,120,121,122))
      )



імхо плохо
f.salelocationfrom = -2 f.salelocationto = 999 f.salelocationfrom =111


ps
оракля юзает ф-цію
LNNVL(f.salelocationfrom = -2) and

....
stax
...
Рейтинг: 0 / 0
07.12.2017, 13:58
    #39565837
MaximaXXL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос
lYY,

Я сейчас что-то набросаю, но вот вопрос, А зачем делать group by по f.saledate если больше его не использовать?
...
Рейтинг: 0 / 0
07.12.2017, 14:03
    #39565846
Dshedoo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос
Dshedoo
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
select 
 a1.mag,
 sum(a1.prih_do+a1.vozv_do-a1.rash_do-a1.prod_do-a1.rash_vper+a1.prih_vper-a1.prod_vper+a1.vozv_vper) ostss
from
(select 
  case when f.salelocationfrom = -2 then f.salelocationto else f.salelocationfrom end mag,
  sum(case when f.saledate<to_date('01.11.2017','DD.MM.YYYY') and f.saletype = 'WO'
    then f.primecost else 0 end) rash_do,
  sum(case when f.saledate<to_date('01.11.2017','DD.MM.YYYY') and f.saletype = 'WI'
    then f.primecost else 0 end) prih_do,   
  sum(case when f.saledate<to_date('01.11.2017','DD.MM.YYYY') and f.saletype = 'CS'
    then f.primecost else 0 end) prod_do,   
  sum(case when f.saledate<to_date('01.11.2017','DD.MM.YYYY') and f.saletype = 'CR'
    then f.primecost else 0 end) vozv_do,   
  sum(case when f.saledate >= to_date('01.11.2017','DD.MM.YYYY') and f.saletype = 'WO'
    then f.primecost else 0 end) rash_vper,   
  sum(case when f.saledate >= to_date('01.11.2017','DD.MM.YYYY') and f.saletype = 'WI'
    then f.primecost else 0 end) prih_vper,   
  sum(case when f.saledate >= to_date('01.11.2017','DD.MM.YYYY') and f.saletype = 'CS'
    then f.primecost else 0 end) prod_vper,   
  sum(case when f.saledate >= to_date('01.11.2017','DD.MM.YYYY') and f.saletype = 'CR'
    then f.primecost else 0 end) vozv_vper,    
  sum(case when f.saledate >= to_date('01.11.2017','DD.MM.YYYY') and f.saletype = 'CS'
    then f.salesum else 0 end) prod_vper3,   
  sum(case when f.saledate >= to_date('01.11.2017','DD.MM.YYYY') and f.saletype = 'CR'
    then f.salesum else 0 end) vozv_vper3    
from supermag.ffmaprep f
where f.rectype=1
 and f.saledate<=to_date('30.11.2017','DD.MM.YYYY')
 and f.saletype in ('WO','WI','CS','CR')
 and 
--
--1)
    case when f.salelocationfrom = -2 then f.salelocationto else f.salelocationfrom end in (111,112,120,121,122)
--2)
     (
      (f.salelocationfrom = -2 and f.salelocationto in (111,112,120,121,122))
     or
      (f.salelocationfrom in (111,112,120,121,122))
      )
--
group by case when f.salelocationfrom = -2 then f.salelocationto else f.salelocationfrom end) a1
group by a1.mag



Так лучше?
...
Рейтинг: 0 / 0
07.12.2017, 14:17
    #39565865
MaximaXXL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос
lYY,

По быстрому получилось что-то такое:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
select 
  decode(f.salelocationfrom,-2,f.salelocationto,f.salelocationfrom) mag,
  sum( case f.saletype when 'WO' then -1*f.primecost /*-1 rash_do_vper,*/
                       when 'WI' then    f.primecost /*+1 prih_do_vper,*/
                       when 'CS' then -1*f.primecost /*-1 prod_do_vper,*/
                       when 'CR' then    f.primecost /*+1 vozv_do_vper,*/
                       else 0 end 
                       ) ostss
from supermag.ffmaprep f
where f.rectype=1
 and f.saledate<=to_date('30.11.2017','DD.MM.YYYY')
 /*and decode(f.salelocationfrom,-2,f.salelocationto,f.salelocationfrom) in (111,112,120,121,122)*/
      (
      (f.salelocationfrom = -2 and f.salelocationto in (111,112,120,121,122))
     or
      (f.salelocationfrom in (111,112,120,121,122))
      )
group by decode(f.salelocationfrom,-2,f.salelocationto,f.salelocationfrom)



Хотя и не проверял =)
...
Рейтинг: 0 / 0
07.12.2017, 14:31
    #39565887
lYY
lYY
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос
MaximaXXLlYY,

Я сейчас что-то набросаю, но вот вопрос, А зачем делать group by по f.saledate если больше его не использовать?
это не я писал, я админ просто)

Всем спасибо, я позже протестирую и по результатам отпишусь.
...
Рейтинг: 0 / 0
07.12.2017, 14:54
    #39565913
Dshedoo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос
MaximaXXL,

Else 0 подменить на where f.saletype in ('WO','WI','CS','CR')

А так прям перфекто)
...
Рейтинг: 0 / 0
07.12.2017, 15:00
    #39565918
lYY
lYY
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос
Взял исходный запрос на один магазин - 2 минуты, полное сканирование.
Сделал через union all, как выше посоветовали. Идет по индексам, выполняется 2 секунды.
Отправил разработчикам, путь тестируют.
...
Рейтинг: 0 / 0
07.12.2017, 15:03
    #39565923
lYY
lYY
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос
MaximaXXLlYY,

По быстрому получилось что-то такое:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
select 
  decode(f.salelocationfrom,-2,f.salelocationto,f.salelocationfrom) mag,
  sum( case f.saletype when 'WO' then -1*f.primecost /*-1 rash_do_vper,*/
                       when 'WI' then    f.primecost /*+1 prih_do_vper,*/
                       when 'CS' then -1*f.primecost /*-1 prod_do_vper,*/
                       when 'CR' then    f.primecost /*+1 vozv_do_vper,*/
                       else 0 end 
                       ) ostss
from supermag.ffmaprep f
where f.rectype=1
 and f.saledate<=to_date('30.11.2017','DD.MM.YYYY')
 /*and decode(f.salelocationfrom,-2,f.salelocationto,f.salelocationfrom) in (111,112,120,121,122)*/
      (
      (f.salelocationfrom = -2 and f.salelocationto in (111,112,120,121,122))
     or
      (f.salelocationfrom in (111,112,120,121,122))
      )
group by decode(f.salelocationfrom,-2,f.salelocationto,f.salelocationfrom)



Хотя и не проверял =)

Не проходит вот эта строка:
Код: plsql
1.
(f.salelocationfrom = -2 and f.salelocationto in (120))
...
Рейтинг: 0 / 0
07.12.2017, 15:08
    #39565932
lYY
lYY
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос
вот так работает:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
select 
  decode(f.salelocationfrom,-2,f.salelocationto,f.salelocationfrom) mag,
  sum( case f.saletype when 'WO' then -1*f.primecost /*-1 rash_do_vper,*/
                       when 'WI' then    f.primecost /*+1 prih_do_vper,*/
                       when 'CS' then -1*f.primecost /*-1 prod_do_vper,*/
                       when 'CR' then    f.primecost /*+1 vozv_do_vper,*/
                       else 0 end 
                       ) ostss
from supermag.ffmaprep f
where f.rectype=1
 and f.saledate<=to_date('30.11.2017','DD.MM.YYYY')
 /*and decode(f.salelocationfrom,-2,f.salelocationto,f.salelocationfrom) in (111,112,120,121,122)*/
 and
      (
      (f.salelocationfrom = -2 and f.salelocationto in (120))
     or
      (f.salelocationfrom in (120))
      )
group by decode(f.salelocationfrom,-2,f.salelocationto,f.salelocationfrom)


но дольше, 86 секунд, идет bitmap convertion
...
Рейтинг: 0 / 0
07.12.2017, 15:08
    #39565933
MaximaXXL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос
Dshedoo,

Там есть куда руки приложить ...
else 0 можно игнорить ... все равно null под суммой будет проигнорирован.
если добавлять
f.saletype in ('WO','WI','CS','CR')

то тогда уже так:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
select 
  decode(f.salelocationfrom,-2,f.salelocationto,f.salelocationfrom) mag,
  sum(decode(f.saletype, 'WO', -1, 'CS', -1 , 1)*f.primecost) ostss

from supermag.ffmaprep f
where f.rectype=1
 and f.saledate<=to_date('30.11.2017','DD.MM.YYYY')
 and f.saletype in ('WO','WI','CS','CR')
 /*and decode(f.salelocationfrom,-2,f.salelocationto,f.salelocationfrom) in (111,112,120,121,122)*/
      (
      (f.salelocationfrom = -2 and f.salelocationto in (111,112,120,121,122))
     or
      (f.salelocationfrom in (111,112,120,121,122))
      )
group by decode(f.salelocationfrom,-2,f.salelocationto,f.salelocationfrom)



Хотя так я бы прокоментировал что хотел сказать автор
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Помогите оптимизировать запрос / 25 сообщений из 54, страница 1 из 3
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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