Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Помогите с селектом / 7 сообщений из 7, страница 1 из 1
12.09.2021, 17:50
    #40096983
zhg
zhg
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с селектом
Есть таблица со стоимостью услуги (поле costs). В ней также содержится информация о периоде действия данной услуги (dstart и dend). Поле nam содержит наименование компании. Нужно получать актуальную стоимость услуги для компании. Если компании нет в таблице, нужно брать стоимость на общих основаниях из строки (nam = 'general' and dend is NULL)

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
with t as 
(
select 'general' as nam, 10 as costs, to_date('01.01.2018','dd.mm.yyyy') as dstart, to_date('01.01.2019','dd.mm.yyyy') as dend  from dual
union all
select 'general' as nam, 15 as costs, to_date('02.01.2019','dd.mm.yyyy') as dstart, null as dend  from dual
union all
select 'ooo roga' as nam, 12 as costs, to_date('05.01.2019','dd.mm.yyyy') as dstart, to_date('02.08.2019','dd.mm.yyyy')  as dend  from dual
union all
select 'ooo roga' as nam, 11 as costs, to_date('03.08.2019','dd.mm.yyyy') as dstart, null  as dend  from dual
union all
select 'ooo kopyta' as nam, 14 as costs, to_date('13.08.2020','dd.mm.yyyy') as dstart, null  as dend  from dual

)
...
Рейтинг: 0 / 0
12.09.2021, 19:53
    #40097005
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с селектом
zhg,

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
with t as 
(
select 'general' as nam, 10 as costs, to_date('01.01.2018','dd.mm.yyyy') as dstart, to_date('01.01.2019','dd.mm.yyyy') as dend  from dual
union all
select 'general' as nam, 15 as costs, to_date('02.01.2019','dd.mm.yyyy') as dstart, null as dend  from dual
union all
select 'ooo roga' as nam, 12 as costs, to_date('05.01.2019','dd.mm.yyyy') as dstart, to_date('02.08.2019','dd.mm.yyyy')  as dend  from dual
union all
select 'ooo roga' as nam, 11 as costs, to_date('03.08.2019','dd.mm.yyyy') as dstart, null  as dend  from dual
union all
select 'ooo kopyta' as nam, 14 as costs, to_date('13.08.2020','dd.mm.yyyy') as dstart, null  as dend  from dual
)
select *
from t
where nam in (:cname, 'general')
and sysdate between dstart and nvl(dend,date'9999-01-01')
order by decode(nam,'general',2,1)
fetch first 1 rows only;


Код: 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.
SQL> host cat tests/costs.sql
with t as
(
select 'general' as nam, 10 as costs, to_date('01.01.2018','dd.mm.yyyy') as dstart, to_date('01.01.2019','dd.mm.yyyy') as dend  from dual
union all
select 'general' as nam, 15 as costs, to_date('02.01.2019','dd.mm.yyyy') as dstart, null as dend  from dual
union all
select 'ooo roga' as nam, 12 as costs, to_date('05.01.2019','dd.mm.yyyy') as dstart, to_date('02.08.2019','dd.mm.yyyy')  as dend  from dual
union all
select 'ooo roga' as nam, 11 as costs, to_date('03.08.2019','dd.mm.yyyy') as dstart, null  as dend  from dual
union all
select 'ooo kopyta' as nam, 14 as costs, to_date('13.08.2020','dd.mm.yyyy') as dstart, null  as dend  from dual
)
select *
from t
where nam in (:cname, 'general')
and sysdate between dstart and nvl(dend,date'9999-01-01')
order by decode(nam,'general',2,1)
fetch first 1 rows only;
SQL>
SQL>
SQL> var cname varchar2(10)
SQL> exec :cname:='ooo roga';

PL/SQL procedure successfully completed.

SQL> @tests/costs.sql

NAM             COSTS DSTART              DEND
---------- ---------- ------------------- -------------------
ooo roga           11 2019-08-03 00:00:00

SQL> exec :cname:='ooo noname';

PL/SQL procedure successfully completed.

SQL> @tests/costs.sql

NAM             COSTS DSTART              DEND
---------- ---------- ------------------- -------------------
general            15 2019-01-02 00:00:00

...
Рейтинг: 0 / 0
13.09.2021, 08:24
    #40097038
zhg
zhg
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с селектом
Sayan Malakshinov, спасибо, но не могу понять решения с order by decode(nam,'general',2,1). Что за хитрая сортировка? Вы исходите из того, что стоимость услуги по умолчанию выше чем по предложениям для компании?
...
Рейтинг: 0 / 0
13.09.2021, 15:10
    #40097238
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с селектом
zhg,

добавляем сортировку: если 'general' то 2, иначе 1
...
Рейтинг: 0 / 0
13.09.2021, 22:34
    #40097388
zhg
zhg
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с селектом
Sayan Malakshinov
zhg,

добавляем сортировку: если 'general' то 2, иначе 1

а если появится клиент для которого услуга будет стоить дороже чем цена на общих основаниях.
...
Рейтинг: 0 / 0
13.09.2021, 23:43
    #40097403
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с селектом
zhg

а если появится клиент для которого услуга будет стоить дороже чем цена на общих основаниях.


Для танкистов:

Код: plsql
1.
where nam in (:cname, 'general')



выберет одну строку - 'general' если :cname не существует и две строки :cname и 'general' если :cname существует а нам нужно одну строку - :cname если :cname существует. Вот для второго случая

Код: plsql
1.
order by decode(nam,'general',2,1)



отсортирует эти две строки так что :cname будет первой. А

Код: plsql
1.
fetch first 1 rows only



возьмет только эту первую строку с :cname а вторую с 'general' откинет, что нам и нужно.

SY.
...
Рейтинг: 0 / 0
14.09.2021, 09:06
    #40097444
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с селектом
SY,

если надо токо стоимость, я б кодировал влоб

select nvl((select costs from t where nam=:n and ),(select costs where nam='general' and ...)) c
from dual

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


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