Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 требуется помощь в написании запроса (возврат несуществующих данных в запросе)  [new]
APEXHoBu4ok
Member

Откуда:
Сообщений: 49
Здравствуйте, уважаемые. Простите, что отнимаю ваше драгоценное время, но не нашел больше выхода как написать в данный форум. Часто через поиск нахожу здесь нужные ответы, но в данном случае даже не знаю как спросить. В общем, есть такая проблема:
в таблице хранятся данные за разные даты о разной технике. Надо взять все эти данные, только за некоторые даты данные могут отсутствовать, тогда за эту дату надо взять данные по умолчанию, всё еще усложняется тем, что join объединяет всё из разных таблиц. Я уже 3дня сижу и ничего не могу придумать.

выглядит сейчас мой запрос вот так:


CREATE OR REPLACE VIEW ALLDURATION
(марка_техники, код, дата, смена, ремонт)
AS
select modelname, truckname, dd, смена, ремонт FROM (WITH DATES AS
(SELECT TO_DATE ('01-11-11', 'DD-MM-RR')-1 + L DD
FROM (SELECT LEVEL L
FROM DUAL
CONNECT BY LEVEL < 1000) CAL)
SELECT DD
FROM DATES) dt

join (select tm.MODELNAME, t.TRUCKNAME, sss.taskdate, 1 смена, ремонт from export.truckmodels tm
join export.trucks t on tm.MODELNAME=t.model
join (select taskdate,shift, truckid, allduration as ремонт from export.Shiftstopsummary group by truckid,taskdate,shift) sss on t.TRUCKNAME=sss.TRUCKID and sss.shift=1) sel on dt.DD=sel.taskdate;


подробности: беру все даты начиная с 1.11.11 и объединяю их с данными за эти числа. и вот получаются пробелы.

получается:
марка_техники|код| дата | смена |ремонт
------------------------------------------------------------
один |25 |01.05.2012| 1 | 5
------------------------------------------------------------
один |26 |01.05.2012| 1 | 6
------------------------------------------------------------
два |58 |01.05.2012| 1 | 9
------------------------------------------------------------
два |59 |01.05.2012| 1 | 10
------------------------------------------------------------
один |25 |02.05.2012| 1 | 3
------------------------------------------------------------
два |58 |02.05.2012| 1 | 16
------------------------------------------------------------
два |59 |02.05.2012| 1 | 13
------------------------------------------------------------

и получается что на марку техники "один" с кодом "26" нету данных и надо вставить дефолтовые, чтобы выглядело это так:
марка_техники|код| дата | смена |ремонт
------------------------------------------------------------
один |25 |01.05.2012| 1 | 5
------------------------------------------------------------
один |26 |01.05.2012| 1 | 6
------------------------------------------------------------
два |58 |01.05.2012| 1 | 9
------------------------------------------------------------
два |59 |01.05.2012| 1 | 10
------------------------------------------------------------
один |25 |02.05.2012| 1 | 3
------------------------------------------------------------
один |26 |02.05.2012| 1 | 999
------------------------------------------------------------
два |58 |02.05.2012| 1 | 16
------------------------------------------------------------
два |59 |02.05.2012| 1 | 13
------------------------------------------------------------


извините, если немного сумбурно рассказал о проблеме, но думаю суть ясна, очень нужна помощь, сам в PL/SQL новичок (всего 1месяц работаю), поэтому может даже представленный запрос наговнокодил, не обессудьте.
18 май 12, 12:30    [12576074]     Ответить | Цитировать Сообщить модератору
 Re: требуется помощь в написании запроса (возврат несуществующих данных в запросе)  [new]
AmKad
Member

Откуда:
Сообщений: 5222
APEXHoBu4ok,

как следует задавать вопросы по sql
18 май 12, 12:31    [12576088]     Ответить | Цитировать Сообщить модератору
 Re: требуется помощь в написании запроса (возврат несуществующих данных в запросе)  [new]
xxxxnnnn
Member

Откуда: Минск
Сообщений: 76
так а где эти дефолтные данные?
18 май 12, 12:37    [12576160]     Ответить | Цитировать Сообщить модератору
 Re: требуется помощь в написании запроса (возврат несуществующих данных в запросе)  [new]
xxxxnnnn
Member

Откуда: Минск
Сообщений: 76
а вообще запрос простейший - если правильно и корректно озвучить требования
18 май 12, 12:40    [12576191]     Ответить | Цитировать Сообщить модератору
 Re: требуется помощь в написании запроса (возврат несуществующих данных в запросе)  [new]
APEXHoBu4ok
Member

Откуда:
Сообщений: 49
AmKad
APEXHoBu4ok,

как следует задавать вопросы по sql


APEXHoBu4ok
Здравствуйте, уважаемые. Простите, что отнимаю ваше драгоценное время, но не нашел больше выхода как написать в данный форум. Часто через поиск нахожу здесь нужные ответы, но в данном случае даже не знаю как спросить. В общем, есть такая проблема:
в таблице хранятся данные за разные даты о разной технике. Надо взять все эти данные, только за некоторые даты данные могут отсутствовать, тогда за эту дату надо взять данные по умолчанию, всё еще усложняется тем, что join объединяет всё из разных таблиц. Я уже 3дня сижу и ничего не могу придумать.

выглядит сейчас мой запрос вот так:


CREATE OR REPLACE VIEW ALLDURATION
(марка_техники, код, дата, смена, ремонт)
AS
select modelname, truckname, dd, смена, ремонт FROM (WITH DATES AS
(SELECT TO_DATE ('01-11-11', 'DD-MM-RR')-1 + L DD
FROM (SELECT LEVEL L
FROM DUAL
CONNECT BY LEVEL < 1000) CAL)
SELECT DD
FROM DATES) dt

join (select tm.MODELNAME, t.TRUCKNAME, sss.taskdate, 1 смена, ремонт from export.truckmodels tm
join export.trucks t on tm.MODELNAME=t.model
join (select taskdate,shift, truckid, allduration as ремонт from export.Shiftstopsummary group by truckid,taskdate,shift) sss on t.TRUCKNAME=sss.TRUCKID and sss.shift=1) sel on dt.DD=sel.taskdate;


подробности: беру все даты начиная с 1.11.11 и объединяю их с данными за эти числа. и вот получаются пробелы.

получается:
with t as (select 'один' марка_техники '25' код '01.05.2012' дата '5' ремонт status from dual
union select 'один' марка_техники '26' код '01.05.2012' дата '6' ремонт status from dual
union select 'два' марка_техники '58' код '01.05.2012' дата '9' ремонт status from dual
union select 'два' марка_техники '59' код '01.05.2012' дата '10' ремонт status from dual
union select 'один' марка_техники '25' код '02.05.2012' дата '3' ремонт status from dual
union select 'два' марка_техники '58' код '02.05.2012' дата '16' ремонт status from dual
union select 'два' марка_техники '59' код '02.05.2012' дата '13' ремонт status from dual)
select * from t;


и получается что на марку техники "один" с кодом "26" нету данных и надо вставить дефолтовые, чтобы выглядело это так:

with t as (select 'один' марка_техники '25' код '01.05.2012' дата '5' ремонт status from dual
union select 'один' марка_техники '26' код '01.05.2012' дата '6' ремонт status from dual
union select 'два' марка_техники '58' код '01.05.2012' дата '9' ремонт status from dual
union select 'два' марка_техники '59' код '01.05.2012' дата '10' ремонт status from dual
union select 'один' марка_техники '25' код '02.05.2012' дата '3' ремонт status from dual
union select 'один' марка_техники '26' код '02.05.2012' дата '999' ремонт status from dual
union select 'два' марка_техники '58' код '02.05.2012' дата '16' ремонт status from dual
union select 'два' марка_техники '59' код '02.05.2012' дата '13' ремонт status from dual)
select * from t;



извините, если немного сумбурно рассказал о проблеме, но думаю суть ясна, очень нужна помощь, сам в PL/SQL новичок (всего 1месяц работаю), поэтому может даже представленный запрос наговнокодил, не обессудьте.
18 май 12, 12:42    [12576211]     Ответить | Цитировать Сообщить модератору
 Re: требуется помощь в написании запроса (возврат несуществующих данных в запросе)  [new]
APEXHoBu4ok
Member

Откуда:
Сообщений: 49
может я слепой, но не вижу кнопку "редактировать" сообщение, опять же извините!!!!

дефолтовые значения не из таблицы берутся, они всегда константа - 999 к примеру
18 май 12, 12:43    [12576228]     Ответить | Цитировать Сообщить модератору
 Re: требуется помощь в написании запроса (возврат несуществующих данных в запросе)  [new]
APEXHoBu4ok
Member

Откуда:
Сообщений: 49
xxxxnnnn
а вообще запрос простейший - если правильно и корректно озвучить требования


я постарался как можно подробней расписать. и я ж говорю, что новичок в этом деле, для меня этот запрос уже отнял около 20часов раздумий.
18 май 12, 12:45    [12576250]     Ответить | Цитировать Сообщить модератору
 Re: требуется помощь в написании запроса (возврат несуществующих данных в запросе)  [new]
-2-
Member

Откуда:
Сообщений: 15330
APEXHoBu4ok,

partition right join
18 май 12, 12:46    [12576256]     Ответить | Цитировать Сообщить модератору
 Re: требуется помощь в написании запроса (возврат несуществующих данных в запросе)  [new]
xxxxnnnn
Member

Откуда: Минск
Сообщений: 76
select date_dd, nvl(то_чего_за данную_дату_нету_1, константа1),  nvl(то_чего_за данную_дату_нету_2, константа2) ....
from (
(select date_dd .....) t
left join
(select всё_о_технике ....) t1 on t.date_dd = t1.taskdate

) t3
18 май 12, 13:26    [12576625]     Ответить | Цитировать Сообщить модератору
 Re: требуется помощь в написании запроса (возврат несуществующих данных в запросе)  [new]
xxxxnnnn
Member

Откуда: Минск
Сообщений: 76
в прошлом посте ерунду конечно написал, -

select date_dd, id_записи, decode(t1.taskdate, null, константа1, что_надо_вывести_1), decode(t1.taskdate, null, константа2, что_надо_вывести_2), ....
from (
(select date_dd .....) t
left join partition by (id_записи)
(select id_записи, другие_данные ....) t1 on t.date_dd = t1.taskdate

) t3
18 май 12, 14:30    [12577241]     Ответить | Цитировать Сообщить модератору
 Re: требуется помощь в написании запроса (возврат несуществующих данных в запросе)  [new]
APEXHoBu4ok
Member

Откуда:
Сообщений: 49
xxxxnnnn
в прошлом посте ерунду конечно написал, -

select date_dd, id_записи, decode(t1.taskdate, null, константа1, что_надо_вывести_1), decode(t1.taskdate, null, константа2, что_надо_вывести_2), ....
from (
(select date_dd .....) t
left join partition by (id_записи)
(select id_записи, другие_данные ....) t1 on t.date_dd = t1.taskdate

) t3


сложно понять что-либо без комментариев, особенно когда в синтаксисе столько ошибок(((((
21 май 12, 06:10    [12585961]     Ответить | Цитировать Сообщить модератору
 Re: требуется помощь в написании запроса (возврат несуществующих данных в запросе)  [new]
APEXHoBu4ok
Member

Откуда:
Сообщений: 49
попытался поковыряться. decode заменил на case, теперь выглядит это так (здесь думаю ошибки нету):

CREATE OR REPLACE VIEW ALLDURATION
(марка_автосамосвала, код, дата, смена, ремонт, линия)
AS
select modelname, truckname, dd, смена, case when ремонт>11.5 then 11.5 when ремонт=null then 999 else ремонт end, case when ремонт>11.5 then 0 when ремонт=null then 999 else 11.5-ремонт end
FROM
(WITH DATES AS
(SELECT TO_DATE ('01-11-11', 'DD-MM-RR')-1 + L DD
FROM (SELECT LEVEL L
FROM DUAL
CONNECT BY LEVEL < 1000) CAL)
SELECT DD
FROM DATES) dt

partition by (taskdate)
left join (select tm.MODELNAME, t.TRUCKNAME, sss.taskdate, 1 смена, ремонт from export.truckmodels tm
join export.trucks t on tm.MODELNAME=t.model
join (select taskdate,shift, truckid, round(24*sum(case when category_id in (1584,1600,1590) then allduration else 0 end),2) ремонт from export.Shiftstopsummary group by truckid,taskdate,shift) sss on t.TRUCKNAME=sss.TRUCKID and sss.shift=1
union
select tm.MODELNAME, t.TRUCKNAME, sss.taskdate, 2 смена, ремонт from export.truckmodels tm
join export.trucks t on tm.MODELNAME=t.model
join (select taskdate,shift, truckid, round(24*sum(case when category_id in (1584,1600,1590) then allduration else 0 end),2) ремонт from export.Shiftstopsummary group by truckid,taskdate,shift) sss on t.TRUCKNAME=sss.TRUCKID and sss.shift=2) sel

on dt.DD=sel.taskdate;


непонятно что писать в partition by (???????) если нету id и чего не хватает еще?
21 май 12, 06:17    [12585964]     Ответить | Цитировать Сообщить модератору
 Re: требуется помощь в написании запроса (возврат несуществующих данных в запросе)  [new]
APEXHoBu4ok
Member

Откуда:
Сообщений: 49
попробовал так:
CREATE OR REPLACE VIEW ALLDURATION
(марка_автосамосвала, код, дата, смена, ремонт, линия)
AS
select modelname, truckname, dd, смена, case when ремонт>11.5 then 11.5 when ремонт=null then 999 else ремонт end, case when ремонт>11.5 then 0 when ремонт=null then 999 else 11.5-ремонт end
FROM
(WITH DATES AS
(SELECT TO_DATE ('01-11-11', 'DD-MM-RR')-1 + L DD
FROM (SELECT LEVEL L
FROM DUAL
CONNECT BY LEVEL < 1000) CAL)
SELECT DD
FROM DATES) dt

partition by ("SORT")
left join (select tm.MODELNAME||t.TRUCKNAME||sss.taskdate||'1'||ремонт as "SORT", tm.MODELNAME, t.TRUCKNAME, sss.taskdate, 1 смена, ремонт from export.truckmodels tm
join export.trucks t on tm.MODELNAME=t.model
join (select taskdate,shift, truckid, round(24*sum(case when category_id in (1584,1600,1590) then allduration else 0 end),2) ремонт from export.Shiftstopsummary group by truckid,taskdate,shift) sss on t.TRUCKNAME=sss.TRUCKID and sss.shift=1
union
select tm.MODELNAME||t.TRUCKNAME||sss.taskdate||'1'||ремонт as "SORT", tm.MODELNAME, t.TRUCKNAME, sss.taskdate, 2 смена, ремонт from export.truckmodels tm
join export.trucks t on tm.MODELNAME=t.model
join (select taskdate,shift, truckid, round(24*sum(case when category_id in (1584,1600,1590) then allduration else 0 end),2) ремонт from export.Shiftstopsummary group by truckid,taskdate,shift) sss on t.TRUCKNAME=sss.TRUCKID and sss.shift=2) sel

on dt.DD=sel.taskdate;


больше идей нету((((
21 май 12, 06:27    [12585967]     Ответить | Цитировать Сообщить модератору
 Re: требуется помощь в написании запроса (возврат несуществующих данных в запросе)  [new]
APEXHoBu4ok
Member

Откуда:
Сообщений: 49
наверное немаловажным будет уточнение, о котором я забыл сказать в самом начале: что на одну дату приходится две смены, а данные могут быть только за одну. соотвественно, надо взять дату и подставить: modelname, truckname, смена, а в поле "ремонт" воткнуть дефолтовое значение
21 май 12, 06:33    [12585969]     Ответить | Цитировать Сообщить модератору
 Re: требуется помощь в написании запроса (возврат несуществующих данных в запросе)  [new]
APEXHoBu4ok
Member

Откуда:
Сообщений: 49
в общем, надо чтобы для каждого modelname с каждым truckid и каждой сменой на каждую дату было своё значение "ремонт". Требуется срочно, готов скромно отблагодарить, пополнив счет на телефоне.
21 май 12, 06:53    [12585980]     Ответить | Цитировать Сообщить модератору
 Re: требуется помощь в написании запроса (возврат несуществующих данных в запросе)  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34630
SQL не умеет генерировать записи в таблицах. Создай таблицу и положи туда эти константные данные, возможно с какими-то параметрами, описывающими, когда они должны применяться. Тогда твои проблемы сразу станут проще.

Да, в датах как я понял тоже дырки, тогда нужно создать ещё таблицу со всеми датами, и генерировать постоянно новые,
Тогда запрос твой будет выглядеть примерно так:

Select coalesce(DD.datafield1,fd.datafield1)
From alldates AD
Left join dataondates DD on ad.date = dd.date
Left join defaultdata FD on FD.date=ad.date
21 май 12, 09:39    [12586327]     Ответить | Цитировать Сообщить модератору
 Re: требуется помощь в написании запроса (возврат несуществующих данных в запросе)  [new]
APEXHoBu4ok
Member

Откуда:
Сообщений: 49
MasterZiv,

зачем создавать таблицу с датами, т.к. можно взять их так:
21 май 12, 10:01    [12586428]     Ответить | Цитировать Сообщить модератору
 Re: требуется помощь в написании запроса (возврат несуществующих данных в запросе)  [new]
APEXHoBu4ok
Member

Откуда:
Сообщений: 49
(WITH DATES AS
(SELECT TO_DATE ('01-11-11', 'DD-MM-RR')-1 + L DD
FROM (SELECT LEVEL L
FROM DUAL
CONNECT BY LEVEL < 1000) CAL)
SELECT DD
FROM DATES) dt

что касается остального: таблица с техникой есть, с кодами тоже. разве нельзя просто чтобы вывелись все пересечения по данным?
21 май 12, 10:02    [12586435]     Ответить | Цитировать Сообщить модератору
 Re: требуется помощь в написании запроса (возврат несуществующих данных в запросе)  [new]
APEXHoBu4ok
Member

Откуда:
Сообщений: 49
и тут ведь у меня не надо генерировать записи в таблице, надо вьюшку сделать)
21 май 12, 10:03    [12586439]     Ответить | Цитировать Сообщить модератору
 Re: требуется помощь в написании запроса (возврат несуществующих данных в запросе)  [new]
APEXHoBu4ok
Member

Откуда:
Сообщений: 49
с другой стороны я уже готов на любое безумство, лишь бы сделать то, что нужно)
21 май 12, 10:06    [12586452]     Ответить | Цитировать Сообщить модератору
 Re: требуется помощь в написании запроса (возврат несуществующих данных в запросе)  [new]
stax..
Guest
APEXHoBu4ok
непонятно что писать в partition by (???????) если нету id и чего не хватает еще?

в with добавте данные и напишите что надо получить
with DATES as (
  SELECT DATE '2012-05-01'-1 + level DD
  FROM DUAL CONNECT BY LEVEL < 5)
,t as (
  select 'один' marka, 25 kod, to_date('01.05.2012') dat, 1 smena,5 remont from dual union all
  select 'один',26,to_date('04.05.2012'), 1, 6 from dual union all
  select 'два',58,to_date('01.05.2012'), 1, 9 from dual )
SELECT marka,kod,smena,dd,nvl(remont,999) remont 
from t partition by (marka,kod,smena) right join dates on (dat=dd)
/

SQL> /

MARK        KOD      SMENA DD             REMONT
---- ---------- ---------- ---------- ----------
два          58          1 01.05.2012          9
два          58          1 02.05.2012        999
два          58          1 03.05.2012        999
два          58          1 04.05.2012        999
один         25          1 01.05.2012          5
один         25          1 02.05.2012        999
один         25          1 03.05.2012        999
один         25          1 04.05.2012        999
один         26          1 01.05.2012        999
один         26          1 02.05.2012        999
один         26          1 03.05.2012        999
один         26          1 04.05.2012          6

12 rows selected.


......
stax
21 май 12, 10:13    [12586488]     Ответить | Цитировать Сообщить модератору
 Re: требуется помощь в написании запроса (возврат несуществующих данных в запросе)  [new]
APEXHoBu4ok
Member

Откуда:
Сообщений: 49
stax..,

т.е. Вы предлагаете нахаркодить данных? Дык это много придется забивать, например 365дней в году, за половину только есть данные. Невариант ручками забивать всё....ой как невариант)
21 май 12, 10:16    [12586512]     Ответить | Цитировать Сообщить модератору
 Re: требуется помощь в написании запроса (возврат несуществующих данных в запросе)  [new]
stax..
Guest
APEXHoBu4ok
и тут ведь у меня не надо генерировать записи в таблице, надо вьюшку сделать)

чтоб создать вьюшку надо четко определится за какой период "надо вставить дефолтовые"
напрімер за период с 01.01.1917 по 05.01.1917 данных возможно и нет и их надо догенерить
но вероятность того что ето будет кому-то нужно очень мала
поетому идея с вюшкой сомнительна
можно брать период с min(dat) по мах(dat) із вашей таблички смен, но ето затратно
напр данные есть за 15 лет, но пользуемся обычно за последний год и генерить даты за 15лет не ефективно

также напр данные в будущем, напр перид по 30.05.2012

.....
stax
21 май 12, 10:46    [12586730]     Ответить | Цитировать Сообщить модератору
 Re: требуется помощь в написании запроса (возврат несуществующих данных в запросе)  [new]
APEXHoBu4ok
Member

Откуда:
Сообщений: 49
stax..,

(SELECT TO_DATE ('01-11-11', 'DD-MM-RR')-1 + L DD
FROM (SELECT LEVEL L
FROM DUAL
CONNECT BY LEVEL < 1000) CAL)

ну вот генерирует даты с 01.11.11

а при обращении к вьюшке я буду задавать диапазон дат, будет браться только за месяц....это вообще всё для apex'а создается. но это совсем другая история. главное, чтобы данные были, а остальное - дело техники)
21 май 12, 10:50    [12586773]     Ответить | Цитировать Сообщить модератору
 Re: требуется помощь в написании запроса (возврат несуществующих данных в запросе)  [new]
stax..
Guest
APEXHoBu4ok
stax..,

т.е. Вы предлагаете нахаркодить данных? Дык это много придется забивать, например 365дней в году, за половину только есть данные. Невариант ручками забивать всё....ой как невариант)

конешно что нет
к сожленью вью нельзя сделать с параметрами, а запрос запросто
ведь юсер которому надо отчет задает период, его и использовать
по любому надо четко определится за какие даты добавлять данные
напр до нового года 2012 может такое быть или нет

если брать мой пример то with DATES генерим для ЗАДАННОГО периода
и из t берем dat between dat_from and dat_to

конешно для вью можно і сгенеріть даты с -4712 по 9999 годы но есть ли в етом смысл
.....
stax
21 май 12, 10:57    [12586846]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Oracle Ответить