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

Код: 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
Конструкция case
    #39544161
Ramstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Tihiy_Don, у тебя в этой строчке авторCASE WHEN t$ordt<>to_date('01.01.4712','dd.m.m.yyyy') THEN t$ordt
точка в дате "m.m" лишняя. Может из-за этого)
...
Рейтинг: 0 / 0
Конструкция case
    #39544163
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Конструкция case
    #39544175
Tihiy_Don
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ramstein,

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

env,

Сейчас попробую. Сумму делал по аналогии с предыдущим примером, наверное, зря. Спасибо за ответ.
...
Рейтинг: 0 / 0
Конструкция case
    #39544183
Tihiy_Don
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: 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
Конструкция case
    #39544225
AnSi_Sr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tihiy_DonНе могу разобраться, через кейсы написать новый селект, или же дописать в существующий?
Определенно, да.
...
Рейтинг: 0 / 0
Конструкция case
    #39544229
Tihiy_Don
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AnSi_Sr,
Определённо новый селект или дописать в существующий?
...
Рейтинг: 0 / 0
Конструкция case
    #39544289
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Конструкция case
    #39544299
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Конструкция case
    #39544300
Tihiy_Don
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
автор'ГЏ' -один символ?
Прошу прощения, так скопировалось из навигатора. Там должно быть 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
Конструкция case
    #39544307
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Конструкция case
    #39544344
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Конструкция case
    #39544361
Tihiy_Don
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторВаш запрос да причесать бы, пожалуй начну
Это запрос, я его потом буду переносить в пакет, там у меня переменные отвечающие за даты t$year.
...
Рейтинг: 0 / 0
Конструкция case
    #39544369
Tihiy_Don
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MaximaXXL, выше вашего сообщения я немного изменил запрос и выложил его. Там я убрал свои кейсы. Попробую начать по частичкам, как сказал товарищ выше с fudt. Спасибо, что помогаете.
...
Рейтинг: 0 / 0
Конструкция case
    #39545123
Tihiy_Don
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: 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
Конструкция case
    #39545167
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Конструкция case
    #39545173
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Конструкция case
    #39545198
Tihiy_Don
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
С помощью ваших подсказок (спасибо всем кто помогал начинающему) я смог всё-таки сформировать запрос. Огромное спасибо.
...
Рейтинг: 0 / 0
Конструкция case
    #39545201
Tihiy_Don
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторdistinct - можно не писать ... его сделает UNION
А вот это, к сожалению, не так.
...
Рейтинг: 0 / 0
Конструкция case
    #39545224
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Конструкция case
    #39545250
Tihiy_Don
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Коллега, который меня обучает утверждает что динстинкт необходим.
...
Рейтинг: 0 / 0
Конструкция case
    #39545297
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tihiy_DonКоллега, который меня обучает утверждает что динстинкт необходим.Обоим RTFM http://www.oracle.com/pls/topic/lookup?ctx=db112&id=SQLRF52345]The UNION [ALL], INTERSECT, MINUS Operators (FAQ)
...
Рейтинг: 0 / 0
Конструкция case
    #39545299
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Конструкция case
    #39545318
MaximaXXLdistinct - можно не писать ... его сделает UNIONСделать-то сделает, но "не писать" нельзя для синтаксической симметрии и во избежание гадания при чтении чужого/подзабытого кода, подразумевал ли автор неявный distinct или ступил.
...
Рейтинг: 0 / 0
Конструкция case
    #39545339
Tihiy_Don
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не хотел вызвать спорт, чисто научный интерес для себя. Спасибо за участие и поддержку, разобрался.
Но тут без него в данной конструкции не обойтись, так как и сказал участник "Гость".
...
Рейтинг: 0 / 0
25 сообщений из 28, страница 1 из 2
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Конструкция case
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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