Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Конструкция case / 25 сообщений из 28, страница 1 из 2
30.10.2017, 08:23
    #39544133
Tihiy_Don
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конструкция case
Создал такую конструкцию:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
CASE WHEN t$ordt<>to_date('01.01.4712','dd.m.m.yyyy') THEN t$ordt 
                                WHEN  t$ordt=to_date('01.01.4712','dd.mm.yyyy') THEN t$fudt 
                                WHEN  t$ordt=to_date('01.01.4712','dd.mm.yyyy') AND t$fudt=to_date('01.01.4712','dd.mm.yyyy') 
                                AND t$deps='ГЃ2013' THEN t$fudt=to_date('01.01.2013','dd.mm.yyyy')
                                ELSE  t$fudt=to_date('01.01.2012','dd.mm.yyyy') 
                             END fudt
                     ,SUM(CASE WHEN (b.fabc=' 001' OR b.fabc=' 004') AND b.fasc=a.fasc --инвентарный номер
                      THEN 
                      ELSE 0
                      END)
                     ,SUM(CASE WHEN substr(TRIM(t$fasc),1,1)='ГЏ') 
                      THEN to_date('01.01.2013','dd.mm.yyyy')  --дата выбора из таблицы
                      ELSE 0 END)



Мне было дано такое условие:
Расчет Fudt – Дата первого использования:
Из таблицы tffar051 взять дату первого использования в соответствии с условиями:
Если tffar051. ordt<> 01.01.4712, то берем tffar051. Ordt
Если tffar051. Ordt= 01.01.4712, то берем tffar051. Fudt
Если tffar051. Ordt= 01.01.4712 и tffar051. Fudt = 01.01.4712 и tffar051. depc= «Б2013», то ставим 01.01.2013
Иначе 01.01.2012.
Где tffar051.fabc= « 001» или tffar051.fabc= « 004»; tffar051.fasc= Zdfar202.fasc.
Для инв. номеров, начинающихся на «П» взять 01.01. ||Zdfar202.year||.

Не могу разобраться что написать в THEN "sum(case when (b.fabc=' 001' or b.fabc=' 004') and b.fasc=a.fasc
then
else 0"
Может кто подсказать, что не так я делаю, может неверно реализовываю условие?
...
Рейтинг: 0 / 0
30.10.2017, 09:16
    #39544161
Ramstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конструкция case
Tihiy_Don, у тебя в этой строчке авторCASE WHEN t$ordt<>to_date('01.01.4712','dd.m.m.yyyy') THEN t$ordt
точка в дате "m.m" лишняя. Может из-за этого)
...
Рейтинг: 0 / 0
30.10.2017, 09:24
    #39544163
env
env
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конструкция case
Tihiy_DonГде tffar051.fabc= « 001» или tffar051.fabc= « 004»; tffar051.fasc= Zdfar202.fasc.
WHERE

Tihiy_DonЕсли tffar051. Ordt= 01.01.4712, то берем tffar051. Fudt
Если tffar051. Ordt= 01.01.4712 и tffar051. Fudt = 01.01.4712 и tffar051. depc= «Б2013», то ставим 01.01.2013
Условия пересекаются. Ставь первым более "узкое".

Код: plsql
1.
2.
3.
SUM(CASE WHEN substr(TRIM(t$fasc),1,1)='ГЏ') 
                      THEN to_date('01.01.2013','dd.mm.yyyy')  --дата выбора из таблицы
                      ELSE 0 END)


Что ты ожидаешь получить от суммы дат с числами?
...
Рейтинг: 0 / 0
30.10.2017, 09:39
    #39544175
Tihiy_Don
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конструкция case
Ramstein,

Спасибо большое, моя невнимательность.

env,

Сейчас попробую. Сумму делал по аналогии с предыдущим примером, наверное, зря. Спасибо за ответ.
...
Рейтинг: 0 / 0
30.10.2017, 09:45
    #39544183
Tihiy_Don
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конструкция case
Код: sql
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.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
select   t$prod t$prod
            , prod prod
            , sum_zd sum_zd 
            , sum_soor sum_soor
            , sum_zd_s sum_zd_s
            , sum_dv sum_dv
            , sum_dv_2015 sum_dv_2015
            , sum_zd_s+sum_dv+sum_dv_2015 sum_nal
            , sum_13dv sum_13dv
            , sum_13dv_2015 sum_13dv_2015
            , sum_zem  sum_zem
            , sum_13dv+sum_13dv_2015+sum_zem sum_13v
            ,sum_amni sum_amni   
   from 
   ( select /*+ ORDERED */ distinct case when a.t$year='2016' then a.t$prod
                                     when a.t$year='2015' then 0
                                end t$prod
                     , convert('на 01.','CL8MSWIN1251','CL8ISO8859P5')
                    || case when to_number(a.t$prod)<9 then '0'||to_char(a.t$prod+1)
                            when to_number(a.t$prod)>=9 and to_number(a.t$prod)<12 then to_char(a.t$prod+1)
                            else '01' 
                       end
                    || '.'
                    || case when to_number(a.t$prod)<12 and a.t$year='2016' and t$date=to_date('01.01.2013','dd.mm.yyyy') then '2016'
                            when to_number(a.t$prod)=12 and a.t$year='2015' and t$date=to_date('01.01.2013','dd.mm.yyyy') then '2016'
                            else to_char(2016+1) 
                       end prod
                       
                     , sum(case when trim(a.t$ngrp)='10' then round(a.t$amni)  else 0 
                            end) over (partition by a.t$prod, a.t$year  order by a.t$prod, a.t$year  ) sum_zd
                     , sum(case when trim(a.t$ngrp)='20' then round(a.t$amni)  else 0 
                             end) over (partition by a.t$prod, a.t$year  order by a.t$prod, a.t$year  ) sum_soor
                     , sum(case when (trim(a.t$ngrp)='10') or (trim(a.t$ngrp)='20') then round(a.t$amni)  else 0 
                              end) over (partition by a.t$prod, a.t$year  order by a.t$prod, a.t$year  ) sum_zd_s     
                     ,  sum(case when (trim(a.t$ngrp)<>'10') and (trim(a.t$ngrp)<>'11') and (trim(a.t$ngrp)<>'20')
                              and (b.fudt<to_date('01.01.2013','dd.mm.yyyy')) and (substr(trim(a.t$fasc),1,1)<>'П') then round(a.t$amni) 
                                else 0  end) over (partition by a.t$prod, a.t$year  order by a.t$prod, a.t$year) sum_dv        
                     ,   sum(case when (trim(a.t$ngrp)<>'10') and (trim(a.t$ngrp)<>'11') and (trim(a.t$ngrp)<>'20')
                                  and (b.fudt>=to_date('01.01.2015','dd.mm.yyyy'))  and (b.grdp>='03'and b.grdp<='99')
                                  and (substr(trim(a.t$fasc),1,1)<>'П') then round(a.t$amni) 
                                  else 0  end) over (partition by a.t$prod, a.t$year  order by a.t$prod, a.t$year  )
                                  +  sum(case when (trim(a.t$ngrp)<>'10') and (trim(a.t$ngrp)<>'11') and (trim(a.t$ngrp)<>'20')
                                    and (substr(trim(a.t$fasc),1,1)='П') and (b.grdp>='03'and b.grdp<='99')
                                    then round(a.t$amni)  else 0 
                           end) over (partition by a.t$prod, a.t$year  order by a.t$prod, a.t$year  )  sum_dv_2015             
                     ,  sum(case when (trim(a.t$ngrp)<>'10') and (trim(a.t$ngrp)<>'11') and (trim(a.t$ngrp)<>'20')
                                   and  (b.fudt>=to_date('01.01.2013','dd.mm.yyyy') and b.fudt<=to_date('31.12.2014','dd.mm.yyyy'))
                                   and (substr(trim(a.t$fasc),1,1)<>'П') then round(a.t$amni) 
                                   else 0  end) over (partition by a.t$prod, a.t$year  order by a.t$prod, a.t$year  )  sum_13dv
                     ,   sum(case when (trim(a.t$ngrp)<>'10') and (trim(a.t$ngrp)<>'11') and (trim(a.t$ngrp)<>'20')
                                      and (b.fudt>=to_date('01.01.2015','dd.mm.yyyy'))  and (b.grdp>='01'and b.grdp<='02')
                                    and (substr(trim(a.t$fasc),1,1)<>'П') then round(a.t$amni) 
                                else 0  end) over (partition by a.t$prod, a.t$year  order by a.t$prod, a.t$year  ) 
                       +  sum(case when (trim(a.t$ngrp)<>'10') and (trim(a.t$ngrp)<>'11') and (trim(a.t$ngrp)<>'20')
                                    and (substr(trim(a.t$fasc),1,1)='П') and (b.grdp>='01'and b.grdp<='02')
                                    then round(a.t$amni)  else 0 
                                    end) over (partition by a.t$prod, a.t$year  order by a.t$prod, a.t$year  ) sum_13dv_2015  
                      ,  sum(case when (trim(a.t$ngrp)='11')  then a.t$amni  else 0 
                                    end) over (partition by a.t$prod, a.t$year  order by a.t$prod, a.t$year  ) sum_zem   
--                      ,   trunc(sum(case when (trim(a.t$ngrp)<>'11')  then a.t$amni  else 0 
--                                    end) over (partition by a.t$prod, a.t$year  order by a.t$prod, a.t$year  )) sum_amni 
                      , trunc(sum(a.t$amni) over (partition by a.t$prod, a.t$year  order by a.t$prod, a.t$year )) sum_amni  
                      , case when c.t$ordt<>to_date('01.01.4712','dd.mm.yyyy') then c.t$ordt 
                            when c.t$ordt=to_date('01.01.4712','dd.mm.yyyy') then c.t$fudt 
                            when c.t$ordt=to_date('01.01.4712','dd.mm.yyyy') and c.t$fudt=to_date('01.01.4712','dd.mm.yyyy') 
                            and c.t$deps='Б2013' then c.t$fudt=to_date('01.01.2013','dd.mm.yyyy')
                            else  t$fudt=to_date('01.01.2012','dd.mm.yyyy') 
                       end fudt1
                     ,case when (c.fabc=' 001' or c.fabc=' 004') and c.fasc=a.fasc 
                      then t$year
                      else 0 end
                     
                     ,case when substr(trim(c.t$fasc),1,1)='П') 
                      then to_date('01.01.2013','dd.mm.yyyy')  --в процедуру верну 01.01.||Zdfar202.year||. --
                      else 0 end            
                from baan.tzdfar202001 a, baan.ttffar051001 c
                   , (select distinct t$fasc fasc
                           , t$year year_
                           , t$fudt fudt
                           , t$grdp grdp
                      from baan.ttffar051001 
                      where t$fabc = ' 001'
                      union 
                      select distinct t$fasc fasc
                           , 2015 year_
                           , to_date('01.01.1970','dd.mm.yyyy') fudt 
                           , t$grdp grdp
                      from baan.tzdfar202001
                      where substr(trim(t$fasc),1,1)='П'
                     ) b
                where ((a.t$year=to_char(2016)) or (a.t$year='2015' and a.t$prod='12'))
                      and a.t$fasc = b.fasc
                      and (a.t$loca >= '010000'
                           and a.t$loca <= '999999') )
                order by t$prod


Ребят, а вот весь запрос с моим дописанным условием. Не могу разобраться, через кейсы написать новый селект, или же дописать в существующий?
...
Рейтинг: 0 / 0
30.10.2017, 10:46
    #39544225
AnSi_Sr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конструкция case
Tihiy_DonНе могу разобраться, через кейсы написать новый селект, или же дописать в существующий?
Определенно, да.
...
Рейтинг: 0 / 0
30.10.2017, 10:48
    #39544229
Tihiy_Don
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конструкция case
AnSi_Sr,
Определённо новый селект или дописать в существующий?
...
Рейтинг: 0 / 0
30.10.2017, 11:54
    #39544289
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конструкция case
envЧто ты ожидаешь получить от суммы дат с числами?

Код: 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.
SQL> ed
Wrote file afiedt.buf

  1  with t as (
  2  select sysdate d from dual union all
  3  select to_date('01.01.2013','dd.mm.yyyy') from dual
  4  )
  5* select sum(d) from t
SQL> /
select sum(d) from t
           *
ERROR at line 5:
ORA-00932: inconsistent datatypes: expected NUMBER got DATE


SQL> ed
Wrote file afiedt.buf

  1  with t as (
  2  select sysdate d from dual union all
  3  select to_date('01.01.2013','dd.mm.yyyy') from dual
  4  )
  5* select sum(case when 's'='st' then d else 0 end) from t
SQL> /
select sum(case when 's'='st' then d else 0 end) from t
                                          *
ERROR at line 5:
ORA-00932: inconsistent datatypes: expected DATE got NUMBER



'ГЏ' -один символ?

.....
stax
...
Рейтинг: 0 / 0
30.10.2017, 11:59
    #39544299
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конструкция case
Tihiy_Don
Код: sql
1.
2.
3.
4.
5.
6.
7.
                     ,case when (c.fabc=' 001' or c.fabc=' 004') and c.fasc=a.fasc 
                      then t$year
                      else 0 end
                     
                     ,case when substr(trim(c.t$fasc),1,1)='П') 
                      then to_date('01.01.2013','dd.mm.yyyy')  --в процедуру верну 01.01.||Zdfar202.year||. --
                      else 0 end            


Ребят, а вот весь запрос с моим дописанным условием. Не могу разобраться, через кейсы написать новый селект, или же дописать в существующий?
мож
Код: plsql
1.
2.
3.
4.
5.
6.
7.
                     ,case when (c.fabc=' 001' or c.fabc=' 004') and c.fasc=a.fasc 
                      then t$year
                      else 0 end
                     
                     ,case when substr(trim(c.t$fasc),1,1)='П') 
                      then 2013 --в процедуру верну 01.01.||Zdfar202.year||. --
                      else 0 end          



.....
stax
...
Рейтинг: 0 / 0
30.10.2017, 12:00
    #39544300
Tihiy_Don
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конструкция case
автор'ГЏ' -один символ?
Прошу прощения, так скопировалось из навигатора. Там должно быть where substr(trim(t$fasc),1,1)='П'

Вот мой запрос:

Код: sql
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.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
    select   t$prod t$prod
            , prod prod
            , sum_zd sum_zd 
            , sum_soor sum_soor
            , sum_zd_s sum_zd_s
            , sum_dv sum_dv
            , sum_dv_2015 sum_dv_2015
            , sum_zd_s+sum_dv+sum_dv_2015 sum_nal
            , sum_13dv sum_13dv
            , sum_13dv_2015 sum_13dv_2015
            , sum_zem  sum_zem
            , sum_13dv+sum_13dv_2015+sum_zem sum_13v
            ,sum_amni sum_amni   
   from 
   ( select /*+ ORDERED */ distinct case when a.t$year='2016' then a.t$prod
                                     when a.t$year='2015' then 0
                                end t$prod
                     , convert('на 01.','CL8MSWIN1251','CL8ISO8859P5')
                    || case when to_number(a.t$prod)<9 then '0'||to_char(a.t$prod+1)
                            when to_number(a.t$prod)>=9 and to_number(a.t$prod)<12 then to_char(a.t$prod+1)
                            else '01' 
                       end
                    || '.'
                    || case when to_number(a.t$prod)<12 and a.t$year='2016' then '2016'
                            when to_number(a.t$prod)=12 and a.t$year='2015' then '2016'
                            else to_char(2016+1) 
                       end prod
                       
                     , sum(case when trim(a.t$ngrp)='10' then round(a.t$amni)  else 0 
                            end) over (partition by a.t$prod, a.t$year  order by a.t$prod, a.t$year  ) sum_zd
                     , sum(case when trim(a.t$ngrp)='20' then round(a.t$amni)  else 0 
                             end) over (partition by a.t$prod, a.t$year  order by a.t$prod, a.t$year  ) sum_soor
                     , sum(case when (trim(a.t$ngrp)='10') or (trim(a.t$ngrp)='20') then round(a.t$amni)  else 0 
                              end) over (partition by a.t$prod, a.t$year  order by a.t$prod, a.t$year  ) sum_zd_s     
                     ,  sum(case when (trim(a.t$ngrp)<>'10') and (trim(a.t$ngrp)<>'11') and (trim(a.t$ngrp)<>'20')
                              and (b.fudt<to_date('01.01.2013','dd.mm.yyyy')) and (substr(trim(a.t$fasc),1,1)<>'П') then round(a.t$amni) 
                                else 0  end) over (partition by a.t$prod, a.t$year  order by a.t$prod, a.t$year) sum_dv        
                     ,   sum(case when (trim(a.t$ngrp)<>'10') and (trim(a.t$ngrp)<>'11') and (trim(a.t$ngrp)<>'20')
                                  and (b.fudt>=to_date('01.01.2015','dd.mm.yyyy'))  and (b.grdp>='03'and b.grdp<='99')
                                  and (substr(trim(a.t$fasc),1,1)<>'П') then round(a.t$amni) 
                                  else 0  end) over (partition by a.t$prod, a.t$year  order by a.t$prod, a.t$year  )
                                  +  sum(case when (trim(a.t$ngrp)<>'10') and (trim(a.t$ngrp)<>'11') and (trim(a.t$ngrp)<>'20')
                                    and (substr(trim(a.t$fasc),1,1)='П') and (b.grdp>='03'and b.grdp<='99')
                                    then round(a.t$amni)  else 0 
                           end) over (partition by a.t$prod, a.t$year  order by a.t$prod, a.t$year  )  sum_dv_2015             
                     ,  sum(case when (trim(a.t$ngrp)<>'10') and (trim(a.t$ngrp)<>'11') and (trim(a.t$ngrp)<>'20')
                                   and  (b.fudt>=to_date('01.01.2013','dd.mm.yyyy') and b.fudt<=to_date('31.12.2014','dd.mm.yyyy'))
                                   and (substr(trim(a.t$fasc),1,1)<>'П') then round(a.t$amni) 
                                   else 0  end) over (partition by a.t$prod, a.t$year  order by a.t$prod, a.t$year  )  sum_13dv
                     ,   sum(case when (trim(a.t$ngrp)<>'10') and (trim(a.t$ngrp)<>'11') and (trim(a.t$ngrp)<>'20')
                                      and (b.fudt>=to_date('01.01.2015','dd.mm.yyyy'))  and (b.grdp>='01'and b.grdp<='02')
                                    and (substr(trim(a.t$fasc),1,1)<>'П') then round(a.t$amni) 
                                else 0  end) over (partition by a.t$prod, a.t$year  order by a.t$prod, a.t$year  ) 
                       +  sum(case when (trim(a.t$ngrp)<>'10') and (trim(a.t$ngrp)<>'11') and (trim(a.t$ngrp)<>'20')
                                    and (substr(trim(a.t$fasc),1,1)='П') and (b.grdp>='01'and b.grdp<='02')
                                    then round(a.t$amni)  else 0 
                                    end) over (partition by a.t$prod, a.t$year  order by a.t$prod, a.t$year  ) sum_13dv_2015  
                      ,  sum(case when (trim(a.t$ngrp)='11')  then a.t$amni  else 0 
                                    end) over (partition by a.t$prod, a.t$year  order by a.t$prod, a.t$year  ) sum_zem   
--                      ,   trunc(sum(case when (trim(a.t$ngrp)<>'11')  then a.t$amni  else 0 
--                                    end) over (partition by a.t$prod, a.t$year  order by a.t$prod, a.t$year  )) sum_amni 
                      , trunc(sum(a.t$amni) over (partition by a.t$prod, a.t$year  order by a.t$prod, a.t$year )) sum_amni  
                       
                from baan.tzdfar202001 a
                   , (select distinct t$fasc fasc
                           , t$year year_
                           , t$fudt fudt
                           , t$grdp grdp
                      from baan.ttffar051001 
                      where t$fabc = ' 001'
                        /*case when t$ordt<>to_date('01.01.4712','dd.mm.yyyy') then t$ordt else 0 end
                        ,case when t$ordt=to_date('01.01.4712','dd.mm.yyyy') then fudt else 0 end
                        ,case when t$ordt=to_date('01.01.4712','dd.mm.yyyy') and fudt=to_date('01.01.4712','dd.mm.yyyy') 
                            and t$deps='Б2013' then c.t$fudt=to_date('01.01.2013','dd.mm.yyyy')
                        else  fudt=to_date('01.01.2012','dd.mm.yyyy') 
                        end 
                        ,case when (trim(t$fasc),1,1)='П' then 01.01.'a.t$year' else 0 end*/
                      union 
                      select distinct t$fasc fasc
                           , 2015 year_
                           , to_date('01.01.1970','dd.mm.yyyy') fudt 
                           , t$grdp grdp
                      from baan.tzdfar202001
                      where substr(trim(t$fasc),1,1)='П'
                     ) b
                where ((a.t$year=to_char(2016)) or (a.t$year='2015' and a.t$prod='12'))
                      and a.t$fasc = b.fasc
                      and (a.t$loca >= '010000'
                           and a.t$loca <= '999999') )
                order by t$prod



Не могу разобраться куда вставить условия по данным требования:
авторРасчет Fudt – Дата первого использования:
Из таблицы tffar051 взять дату первого использования в соответствии с условиями:
Если tffar051. ordt<> 01.01.4712, то берем tffar051. Ordt
Если tffar051. Ordt= 01.01.4712, то берем tffar051. Fudt
Если tffar051. Ordt= 01.01.4712 и tffar051. Fudt = 01.01.4712 и tffar051. depc= «Б2013», то ставим 01.01.2013
Иначе 01.01.2012.
Где tffar051.fabc= « 001» или tffar051.fabc= « 004»; tffar051.fasc= Zdfar202.fasc.
Для инв. номеров, начинающихся на «П» взять 01.01. ||Zdfar202.year||.
...
Рейтинг: 0 / 0
30.10.2017, 12:10
    #39544307
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конструкция case
Tihiy_DonНе могу разобраться куда вставить условия по данным требования:


я так понимаю
Код: plsql
1.
2.
3.
4.
                   , (select distinct t$fasc fasc
                           , t$year year_
                           , t$fudt fudt
                           , t$grdp grdp



сначала реализуйте условия которые 100% понимаете, потом добавите другие

......
stax
...
Рейтинг: 0 / 0
30.10.2017, 12:42
    #39544344
MaximaXXL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конструкция case
Tihiy_Don,

Ваш запрос да причесать бы, пожалуй начну
Код: 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.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
select   t$prod t$prod
            , prod prod
            , sum_zd sum_zd 
            , sum_soor sum_soor
            , sum_zd_s sum_zd_s
            , sum_dv sum_dv
            , sum_dv_2015 sum_dv_2015
            , sum_zd_s+sum_dv+sum_dv_2015 sum_nal
            , sum_13dv sum_13dv
            , sum_13dv_2015 sum_13dv_2015
            , sum_zem  sum_zem
            , sum_13dv+sum_13dv_2015+sum_zem sum_13v
            ,sum_amni sum_amni   
   from 
   ( select /*+ ORDERED */ distinct 
decode(a.t$year,'2016',a.t$prod ,'2015',0) t$prod
                     , convert('на 01.','CL8MSWIN1251','CL8ISO8859P5')
                    || decode(a.t$prod,'12','01',Lpad(to_char(a.t$prod+1),2,'0'))/*замена корректна если a.t$prod не может быть больше 12*/
                    || '.'
                    || case when to_number(a.t$prod)<12 and a.t$year='2016' and t$date=to_date('01.01.2013','dd.mm.yyyy') then '2016'
                            when to_number(a.t$prod)=12 and a.t$year='2015' and t$date=to_date('01.01.2013','dd.mm.yyyy') then '2016'
                            else '2017'--to_char(2016+1) 
                       end prod
                       
                     , sum(decode(trim(a.t$ngrp),'10',round(a.t$amni)) ) over (partition by a.t$prod, a.t$year) sum_zd
                     , sum(decode(trim(a.t$ngrp),'20',round(a.t$amni)) ) over (partition by a.t$prod, a.t$year) sum_soor
                     , sum(case when trim(a.t$ngrp) in ('10','20') then round(a.t$amni) else 0 end) over (partition by a.t$prod, a.t$year) sum_zd_s     
                     ,  sum(case when trim(a.t$ngrp) not in ('10','11','20')
                              and (b.fudt<to_date('01.01.2013','dd.mm.yyyy')) and (substr(trim(a.t$fasc),1,1)<>'П') then round(a.t$amni) 
                                else 0  end) over (partition by a.t$prod, a.t$year) sum_dv        

                     ,   sum(case when trim(a.t$ngrp) not in ('10','11','20') and b.grdp between '03' and '99'
                                   then case when substr(trim(a.t$fasc),1,1)<>'П' and b.fudt<to_date('01.01.2015','dd.mm.yyyy') then 0
                                                                                                                            else round(a.t$amni)
                                          end
                                  else 0  end) over (partition by a.t$prod, a.t$year) sum_dv_2015             

                     ,  sum(case when trim(a.t$ngrp) not in ('10','11','20')
                                   and  (b.fudt>=to_date('01.01.2013','dd.mm.yyyy') and b.fudt<=to_date('31.12.2014','dd.mm.yyyy'))
                                   and (substr(trim(a.t$fasc),1,1)<>'П') then round(a.t$amni) 
                                   else 0  end) over (partition by a.t$prod, a.t$year)  sum_13dv
                     ,   sum(case when trim(a.t$ngrp) not in ('10','11','20') and (b.grdp>='01'and b.grdp<='02')
                                        then case when substr(trim(a.t$fasc),1,1)<>'П' and b.fudt<to_date('01.01.2015','dd.mm.yyyy') then 0
                                                       else round(a.t$amni) 
                                               end
                                 end) over (partition by a.t$prod, a.t$year) sum_13dv_2015  
                      ,  sum(decode(trim(a.t$ngrp),'11',a.t$amni)) over (partition by a.t$prod, a.t$year) sum_zem   
--                      ,   trunc(sum(case when (trim(a.t$ngrp)<>'11')  then a.t$amni  else 0 
--                                    end) over (partition by a.t$prod, a.t$year  order by a.t$prod, a.t$year  )) sum_amni 
                      , trunc(sum(a.t$amni) over (partition by a.t$prod, a.t$year)) sum_amni  
                      , case when c.t$ordt<>to_date('01.01.4712','dd.mm.yyyy') then c.t$ordt 
--                            when c.t$ordt=to_date('01.01.4712','dd.mm.yyyy') then c.t$fudt 
                            when c.t$ordt=to_date('01.01.4712','dd.mm.yyyy') and c.t$fudt=to_date('01.01.4712','dd.mm.yyyy') 
                            and c.t$deps='Б2013' then c.t$fudt=to_date('01.01.2013','dd.mm.yyyy') 
                            when c.t$ordt=to_date('01.01.4712','dd.mm.yyyy') then c.t$fudt /*как и было написано "перенести ниже"*/
                            else  t$fudt=to_date('01.01.2012','dd.mm.yyyy') 
                       end fudt1
                     ,case when c.fabc in (' 001',' 004') and c.fasc=a.fasc 
                      then t$year
                      else 0 end
                     
                     ,case when substr(trim(c.t$fasc),1,1)='П') 
                      then to_date('01.01.2013','dd.mm.yyyy')  --в процедуру верну 01.01.||Zdfar202.year||. --
                      else 0 end            /*тут явно несовместимость типов*/
                from baan.tzdfar202001 a, baan.ttffar051001 c /*не имеет связок в where и как следствие будет работать ... странно (умножит все записи в остальных таблицах что приведет к неправильным суммам)*/
                   , (select distinct t$fasc fasc
                           , t$year year_
                           , t$fudt fudt
                           , t$grdp grdp
                      from baan.ttffar051001 
                      where t$fabc = ' 001'
                      union 
                      select distinct t$fasc fasc
                           , 2015 year_
                           , to_date('01.01.1970','dd.mm.yyyy') fudt 
                           , t$grdp grdp
                      from baan.tzdfar202001
                      where substr(trim(t$fasc),1,1)='П'
                     ) b
                where ((a.t$year='2016') or (a.t$year='2015' and a.t$prod='12'))
                      and a.t$fasc = b.fasc
                      and (a.t$loca >= '010000'
                           and a.t$loca <= '999999') )
                order by t$prod
...
Рейтинг: 0 / 0
30.10.2017, 13:01
    #39544361
Tihiy_Don
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конструкция case
авторВаш запрос да причесать бы, пожалуй начну
Это запрос, я его потом буду переносить в пакет, там у меня переменные отвечающие за даты t$year.
...
Рейтинг: 0 / 0
30.10.2017, 13:04
    #39544369
Tihiy_Don
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конструкция case
MaximaXXL, выше вашего сообщения я немного изменил запрос и выложил его. Там я убрал свои кейсы. Попробую начать по частичкам, как сказал товарищ выше с fudt. Спасибо, что помогаете.
...
Рейтинг: 0 / 0
31.10.2017, 11:52
    #39545123
Tihiy_Don
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конструкция case
Код: sql
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.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
 select   t$prod t$prod
            , prod prod
            , sum_zd sum_zd 
            , sum_soor sum_soor
            , sum_zd_s sum_zd_s
            , sum_dv sum_dv
            , sum_dv_2015 sum_dv_2015
            , sum_zd_s+sum_dv+sum_dv_2015 sum_nal
            , sum_13dv sum_13dv
            , sum_13dv_2015 sum_13dv_2015
            , sum_zem  sum_zem
            , sum_13dv+sum_13dv_2015+sum_zem sum_13v
            ,sum_amni sum_amni   
   from 
   ( select /*+ ORDERED */ distinct case when a.t$year='2016' then a.t$prod
                                     when a.t$year='2015' then 0
                                end t$prod
                     , convert('на 01.','CL8MSWIN1251','CL8ISO8859P5')
                    || case when to_number(a.t$prod)<9 then '0'||to_char(a.t$prod+1)
                            when to_number(a.t$prod)>=9 and to_number(a.t$prod)<12 then to_char(a.t$prod+1)
                            else '01' 
                       end
                    || '.'
                    || case when to_number(a.t$prod)<12 and a.t$year='2016' then '2016'
                            when to_number(a.t$prod)=12 and a.t$year='2015' then '2016'
                            else to_char(2016+1) 
                       end prod
                       
                     , sum(case when trim(a.t$ngrp)='10' then round(a.t$amni)  else 0 
                            end) over (partition by a.t$prod, a.t$year  order by a.t$prod, a.t$year  ) sum_zd
                     , sum(case when trim(a.t$ngrp)='20' then round(a.t$amni)  else 0 
                             end) over (partition by a.t$prod, a.t$year  order by a.t$prod, a.t$year  ) sum_soor
                     , sum(case when (trim(a.t$ngrp)='10') or (trim(a.t$ngrp)='20') then round(a.t$amni)  else 0 
                              end) over (partition by a.t$prod, a.t$year  order by a.t$prod, a.t$year  ) sum_zd_s     
                     ,  sum(case when (trim(a.t$ngrp)<>'10') and (trim(a.t$ngrp)<>'11') and (trim(a.t$ngrp)<>'20')
                              and (b.fudt<to_date('01.01.2013','dd.mm.yyyy')) and (substr(trim(a.t$fasc),1,1)<>'П') then round(a.t$amni) 
                                else 0  end) over (partition by a.t$prod, a.t$year  order by a.t$prod, a.t$year) sum_dv        
                     ,   sum(case when (trim(a.t$ngrp)<>'10') and (trim(a.t$ngrp)<>'11') and (trim(a.t$ngrp)<>'20')
                                  and (b.fudt>=to_date('01.01.2015','dd.mm.yyyy'))  and (b.grdp>='03'and b.grdp<='99')
                                  and (substr(trim(a.t$fasc),1,1)<>'П') then round(a.t$amni) 
                                  else 0  end) over (partition by a.t$prod, a.t$year  order by a.t$prod, a.t$year  )
                                  +  sum(case when (trim(a.t$ngrp)<>'10') and (trim(a.t$ngrp)<>'11') and (trim(a.t$ngrp)<>'20')
                                    and (substr(trim(a.t$fasc),1,1)='П') and (b.grdp>='03'and b.grdp<='99')
                                    then round(a.t$amni)  else 0 
                           end) over (partition by a.t$prod, a.t$year  order by a.t$prod, a.t$year  )  sum_dv_2015             
                     ,  sum(case when (trim(a.t$ngrp)<>'10') and (trim(a.t$ngrp)<>'11') and (trim(a.t$ngrp)<>'20')
                                   and  (b.fudt>=to_date('01.01.2013','dd.mm.yyyy') and b.fudt<=to_date('31.12.2014','dd.mm.yyyy'))
                                   and (substr(trim(a.t$fasc),1,1)<>'П') then round(a.t$amni) 
                                   else 0  end) over (partition by a.t$prod, a.t$year  order by a.t$prod, a.t$year  )  sum_13dv
                     ,   sum(case when (trim(a.t$ngrp)<>'10') and (trim(a.t$ngrp)<>'11') and (trim(a.t$ngrp)<>'20')
                                      and (b.fudt>=to_date('01.01.2015','dd.mm.yyyy'))  and (b.grdp>='01'and b.grdp<='02')
                                    and (substr(trim(a.t$fasc),1,1)<>'П') then round(a.t$amni) 
                                else 0  end) over (partition by a.t$prod, a.t$year  order by a.t$prod, a.t$year  ) 
                       +  sum(case when (trim(a.t$ngrp)<>'10') and (trim(a.t$ngrp)<>'11') and (trim(a.t$ngrp)<>'20')
                                    and (substr(trim(a.t$fasc),1,1)='П') and (b.grdp>='01'and b.grdp<='02')
                                    then round(a.t$amni)  else 0 
                                    end) over (partition by a.t$prod, a.t$year  order by a.t$prod, a.t$year  ) sum_13dv_2015  
                      ,  sum(case when (trim(a.t$ngrp)='11')  then a.t$amni  else 0 
                                    end) over (partition by a.t$prod, a.t$year  order by a.t$prod, a.t$year  ) sum_zem   
--                      ,   trunc(sum(case when (trim(a.t$ngrp)<>'11')  then a.t$amni  else 0 
--                                    end) over (partition by a.t$prod, a.t$year  order by a.t$prod, a.t$year  )) sum_amni 
                      , trunc(sum(a.t$amni) over (partition by a.t$prod, a.t$year  order by a.t$prod, a.t$year )) sum_amni  
                       
                from baan.tzdfar202001 a
                   , (select distinct t$fasc fasc
                           , t$year year_
                            
                           ,case when t$ordt<>to_date('01.01.4712','dd.mm.yyyy') then t$ordt
                                when t$ordt=to_date('01.01.4712','dd.mm.yyyy') then t$fudt 
                                when t$ordt=to_date('01.01.4712','dd.mm.yyyy') and t$fudt=to_date('01.01.4712','dd.mm.yyyy') 
                            and t$deps='Б2013' then t$fudt=to_date('01.01.2013','dd.mm.yyyy')
                                when (trim(t$fasc),1,1)='П' then to_date('01.01.2013','dd.mm.yyyy')
                                else  fudt=to_date('01.01.2012','dd.mm.yyyy') 
                                end fudt
                           , t$grdp grdp
                      from baan.ttffar051001 
                      where t$fabc = ' 001' or t$fabc = ' 004'
                        
                      union 
                      select distinct t$fasc fasc
                           , 2015 year_
                           , to_date('01.01.1970','dd.mm.yyyy') fudt 
                           , t$grdp grdp
                      from baan.tzdfar202001
                      where substr(trim(t$fasc),1,1)='П'
                     ) b
                where ((a.t$year=to_char(2016)) or (a.t$year='2015' and a.t$prod='12'))
                      and a.t$fasc = b.fasc
                      and (a.t$loca >= '010000'
                           and a.t$loca <= '999999') )
                order by t$prod



Всёравно ошибка, кейссы прописал в подвыборе из таблицы 051.
...
Рейтинг: 0 / 0
31.10.2017, 12:37
    #39545167
MaximaXXL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конструкция case
Tihiy_Don,

Вы слуаете замечания которые Вам пишут, или пытаетесь уговорить Oracle что Вы написали что-то адекватное?

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
select distinct t$fasc fasc
                           , t$year year_
                            
                           ,case when t$ordt<>to_date('01.01.4712','dd.mm.yyyy') then t$ordt
                                when t$ordt=to_date('01.01.4712','dd.mm.yyyy') then t$fudt  /* Надо переставлять вниз, иначе when ниже никогда не отработает*/
                                when t$ordt=to_date('01.01.4712','dd.mm.yyyy') and t$fudt=to_date('01.01.4712','dd.mm.yyyy') 
                            and t$deps='Б2013' then t$fudt=to_date('01.01.2013','dd.mm.yyyy')
                                when (trim(t$fasc),1,1)='П' then to_date('01.01.2013','dd.mm.yyyy')
                                else  fudt=to_date('01.01.2012','dd.mm.yyyy')  /*Что это за народное творчество? На выходе False/True ждете?*/
                                end fudt
                           , t$grdp grdp
                      from baan.ttffar051001 
                      where t$fabc = ' 001' or t$fabc = ' 004'
                        
                      union 
                      select distinct t$fasc fasc
                           , 2015 year_
                           , to_date('01.01.1970','dd.mm.yyyy') fudt 
                           , t$grdp grdp
                      from baan.tzdfar202001
                      where substr(trim(t$fasc),1,1)='П'



distinct - можно не писать ... его сделает UNION
...
Рейтинг: 0 / 0
31.10.2017, 12:43
    #39545173
MaximaXXL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конструкция case
Tihiy_Don,

И еще 1 результат не заметил сразу
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
select distinct t$fasc fasc
                           , t$year year_
                            
                           ,case when t$ordt<>to_date('01.01.4712','dd.mm.yyyy') then t$ordt
                                when t$ordt=to_date('01.01.4712','dd.mm.yyyy') then t$fudt  /* Надо переставлять вниз, иначе when ниже никогда не отработает*/
                                when t$ordt=to_date('01.01.4712','dd.mm.yyyy') and t$fudt=to_date('01.01.4712','dd.mm.yyyy') 
                            and t$deps='Б2013' then t$fudt=to_date('01.01.2013','dd.mm.yyyy') /*Что это за народное творчество? На выходе False/True ждете?*/
                                when (trim(t$fasc),1,1)='П' then to_date('01.01.2013','dd.mm.yyyy')
                                else  fudt=to_date('01.01.2012','dd.mm.yyyy')  /*Что это за народное творчество? На выходе False/True ждете?*/
                                end fudt
                           , t$grdp grdp
                      from baan.ttffar051001 
                      where t$fabc = ' 001' or t$fabc = ' 004'
                        
                      union 
                      select distinct t$fasc fasc
                           , 2015 year_
                           , to_date('01.01.1970','dd.mm.yyyy') fudt 
                           , t$grdp grdp
                      from baan.tzdfar202001
                      where substr(trim(t$fasc),1,1)='П'



Т.к. case проверяет с верху вниз условия, то найдите правильное место для условия
when (trim(t$fasc),1,1)='П' then to_date('01.01.2013','dd.mm.yyyy')
в Вашем написании оно тоже никогда не отработает ...
...
Рейтинг: 0 / 0
31.10.2017, 13:18
    #39545198
Tihiy_Don
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конструкция case
С помощью ваших подсказок (спасибо всем кто помогал начинающему) я смог всё-таки сформировать запрос. Огромное спасибо.
...
Рейтинг: 0 / 0
31.10.2017, 13:21
    #39545201
Tihiy_Don
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конструкция case
авторdistinct - можно не писать ... его сделает UNION
А вот это, к сожалению, не так.
...
Рейтинг: 0 / 0
31.10.2017, 13:43
    #39545224
MaximaXXL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конструкция case
Tihiy_Donавторdistinct - можно не писать ... его сделает UNION
А вот это, к сожалению, не так.

Вот те раз, обоснуй
Я не понял, в какой части я, по Вашему, ошибся
UNION не сделает distinct?

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
with t as (select 1 a from dual union all
select 1 a from dual union all
select 2 a from dual),
k as (select 3 b from dual union all
select 3 b from dual union all
select 4 b from dual union all
select 1 b from dual)

select a from t
union
select b from k

A
1
2
3
4

4 rows selected.
...
Рейтинг: 0 / 0
31.10.2017, 14:19
    #39545250
Tihiy_Don
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конструкция case
Коллега, который меня обучает утверждает что динстинкт необходим.
...
Рейтинг: 0 / 0
31.10.2017, 15:05
    #39545297
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конструкция case
Tihiy_DonКоллега, который меня обучает утверждает что динстинкт необходим.Обоим RTFM http://www.oracle.com/pls/topic/lookup?ctx=db112&id=SQLRF52345]The UNION [ALL], INTERSECT, MINUS Operators (FAQ)
...
Рейтинг: 0 / 0
31.10.2017, 15:05
    #39545299
MaximaXXL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конструкция case
Tihiy_DonКоллега, который меня обучает утверждает что динстинкт необходим.


Возможно Ваш коллега имеет ввиду distinct верхнего уровня?
select /*+ ORDERED */ distinct

в сборке же таблиц
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
(select distinct ...
                      from baan.ttffar051001 
                      where t$fabc = ' 001' or t$fabc = ' 004'
                      union 
                      select distinct ...
                      from baan.tzdfar202001
                      where substr(trim(t$fasc),1,1)='П'
                     )


union все равно будет делать дистинкт для набора данных....

А возможно Ваш коллега путает union all и union
Можете у него попросить пояснить почему, если он Вас обучает ... во всяком случае Вам будет полезно понимать.
...
Рейтинг: 0 / 0
31.10.2017, 15:19
    #39545318
Конструкция case
MaximaXXLdistinct - можно не писать ... его сделает UNIONСделать-то сделает, но "не писать" нельзя для синтаксической симметрии и во избежание гадания при чтении чужого/подзабытого кода, подразумевал ли автор неявный distinct или ступил.
...
Рейтинг: 0 / 0
31.10.2017, 15:46
    #39545339
Tihiy_Don
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конструкция case
Не хотел вызвать спорт, чисто научный интерес для себя. Спасибо за участие и поддержку, разобрался.
Но тут без него в данной конструкции не обойтись, так как и сказал участник "Гость".
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Конструкция case / 25 сообщений из 28, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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