powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Помогите с селектом
7 сообщений из 7, страница 1 из 1
Помогите с селектом
    #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
Помогите с селектом
    #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
Помогите с селектом
    #40097038
zhg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
zhg
Гость
Sayan Malakshinov, спасибо, но не могу понять решения с order by decode(nam,'general',2,1). Что за хитрая сортировка? Вы исходите из того, что стоимость услуги по умолчанию выше чем по предложениям для компании?
...
Рейтинг: 0 / 0
Помогите с селектом
    #40097238
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
zhg,

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

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

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


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