Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Добавление результатов других запросов в выдачу основного запроса (табличный вид) / 25 сообщений из 26, страница 1 из 2
11.10.2020, 01:58
    #40007375
ARRay001
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление результатов других запросов в выдачу основного запроса (табличный вид)
Доброго времени суток!

Никак не получается отобразить результат в следующем виде:

Основной запрос (zap1): какие-то строки из таблицы, где первым значением идут id и дата (даты могут быть с пропусками):
select t1.id, t1.date1, t1.fld2, t1.fld3... from t1 order by t1.date1;
Дополнительные запросы выдают значения, рассчитываемые подзапросами на основе данных основного запроса или других таблиц.
Могут, для примера, быть вида: Select '1_1' s1_1 from dual или select t1.fld2*2 from zap1, либо значение одного из полей основного запроса.

Надо вывести значения в табличном виде:
Дата1 из основного запроса | Далее несколько столбцов с расчётными значениями (разные способы) из доп. запросов
'Доп строка 1' | Далее несколько столбцов с расчётными значениями (разные способы) из доп. запросов
'Доп строка 2' | Далее несколько столбцов с расчётными значениями (разные способы) из доп. запросов
'Доп строка 3' | Далее несколько столбцов с расчётными значениями (разные способы) из доп. запросов
Дата2 из основного запроса | Далее несколько столбцов с расчётными значениями (разные способы) из доп. запросов
'Доп строка 1' | Далее несколько столбцов с расчётными значениями (разные способы) из доп. запросов
'Доп строка 2' | Далее несколько столбцов с расчётными значениями (разные способы) из доп. запросов
'Доп строка 3' | Далее несколько столбцов с расчётными значениями (разные способы) из доп. запросов
и т.д.
В идеале в конце ещё суммарный итог по каждому из столбцов.

Алгоритм расчёта дополнительных значений по каждой дате одинаков, но может немного корректироваться в зависимости от даты.

Предполагал использовать model, но не понял как соорудить такую конструкцию. Можно ли так сделать с помощью только SQL?
...
Рейтинг: 0 / 0
11.10.2020, 09:32
    #40007393
dmdmdm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление результатов других запросов в выдачу основного запроса (табличный вид)
Опять попытки переложить на СУБД задачи, которые должна решать не она.

Ну напишите динамический запрос. Поддерживать его все равно вам.
...
Рейтинг: 0 / 0
11.10.2020, 10:06
    #40007396
ARRay001
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление результатов других запросов в выдачу основного запроса (табличный вид)
dmdmdm,

На PL-SQL понятно можно. Интересовало, можно ли на чистом SQL...
...
Рейтинг: 0 / 0
11.10.2020, 10:41
    #40007401
dmdmdm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление результатов других запросов в выдачу основного запроса (табличный вид)
На здоровье.

Подзапросы, case.
...
Рейтинг: 0 / 0
11.10.2020, 11:26
    #40007406
ARRay001
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление результатов других запросов в выдачу основного запроса (табличный вид)
dmdmdm,
наверное всё действительно просто, но если бы у меня получилось - я бы сюда не писал. Подозреваю, что case поможет, но как сделать именно такую структуру - пока не понял.
...
Рейтинг: 0 / 0
11.10.2020, 12:10
    #40007414
graycode
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление результатов других запросов в выдачу основного запроса (табличный вид)
ARRay001,

Где тестовый набор данных? Где то что из него должно получиться в результате? Где ваш вариант решения задачи?
...
Рейтинг: 0 / 0
11.10.2020, 22:14
    #40007502
ARRay001
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление результатов других запросов в выдачу основного запроса (табличный вид)
graycode,

Тестовый набор и ожидаемые результаты описаны в первом посте. Если надо - позже сгенерю таблицу с исходными абстрактными данными. Реальную таблицу естественно светить нельзя, а решения пока нет. Только в pl/sql намечается, да и то много неизвестных подзапросов. Важен принцип: как вывести такую структуру ячеек с результатами любых подзапросов именно в таком виде. С данными я уже сам разберусь.
...
Рейтинг: 0 / 0
11.10.2020, 23:44
    #40007515
Правильный Вася
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление результатов других запросов в выдачу основного запроса (табличный вид)
'Доп строка 1' - это какое-то значение или просто пустышка типа "всё та же дата, что и выше"?
Если дата, то почему бы ее не указать? Тогда будет проще.

Алгоритм расчёта дополнительных значений по каждой дате одинаков, но может немного корректироваться в зависимости от даты.
А вот это в простой запрос уже не ляжет, поскольку "тут играем, тут не играем, а тут рыбу заворачивали".
Это либо в PL/SQL, либо в генератор отчётов - для того и делали их.
...
Рейтинг: 0 / 0
12.10.2020, 01:46
    #40007522
graycode
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление результатов других запросов в выдачу основного запроса (табличный вид)
ARRay001
Надо вывести значения в табличном виде:
Дата1 из основного запроса | Далее несколько столбцов с расчётными значениями (разные способы) из доп. запросов
'Доп строка 1' | Далее несколько столбцов с расчётными значениями (разные способы) из доп. запросов
'Доп строка 2' | Далее несколько столбцов с расчётными значениями (разные способы) из доп. запросов
'Доп строка 3' | Далее несколько столбцов с расчётными значениями (разные способы) из доп. запросов
Дата2 из основного запроса | Далее несколько столбцов с расчётными значениями (разные способы) из доп. запросов
'Доп строка 1' | Далее несколько столбцов с расчётными значениями (разные способы) из доп. запросов
'Доп строка 2' | Далее несколько столбцов с расчётными значениями (разные способы) из доп. запросов
'Доп строка 3' | Далее несколько столбцов с расчётными значениями (разные способы) из доп. запросов
и т.д

Код: 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.
with t1 (id, n, date1, fld2, fld3) as
(
              select 1, 0, to_date('10.10.2020', 'DD.MM.YYYY'), 12, 34 from dual
    union all select 2, 0, to_date('11.10.2020', 'DD.MM.YYYY'), 56, 78 from dual
)
, dop1 (n, date1, str, fld2, fld3) as
(
    select 1, to_date('10.10.2020', 'DD.MM.YYYY'), 'Доп строка 1', 21, 43 from dual
)
, dop2 (n, date1, str, fld2, fld3) as
(
    select 2, to_date('10.10.2020', 'DD.MM.YYYY'), 'Доп строка 2', 2, 3 from dual
    union all
    select 2, to_date('11.10.2020', 'DD.MM.YYYY'), 'Доп строка 2', 7, 8 from dual
)
, dop3 (n, date1, str, fld2, fld3) as
(
    select 3, to_date('10.10.2020', 'DD.MM.YYYY'), 'Доп строка 3', 1, 4 from dual
    union all
    select 3, to_date('11.10.2020', 'DD.MM.YYYY'), 'Доп строка 3', 222, 5 from dual
)
, t (id, n, date1, str, fld2, fld3) as
(
select t1.id, n, t1.date1, to_char(t1.date1, 'DD.MM.YYYY'), t1.fld2, t1.fld3 from t1
union all
select t1.id, dop1.n, t1.date1, dop1.str, dop1.fld2, dop1.fld3
  from t1 join dop1 on t1.date1 = dop1.date1
union all
select t1.id, dop2.n, t1.date1, dop2.str, dop2.fld2, dop2.fld3
  from t1 join dop2 on t1.date1 = dop2.date1
union all
select t1.id, dop3.n, t1.date1, dop3.str, dop3.fld2, dop3.fld3
  from t1 join dop3 on t1.date1 = dop3.date1
)
select str
     , case when date1 = to_date('11.10.2020', 'DD.MM.YYYY') and n = 3 
            then t.fld2/2 else t.fld2 end as fld2
     , case when date1 = to_date('10.10.2020', 'DD.MM.YYYY') and t.fld2 = 21
            then (select 65 from dual) else t.fld3 end as fld3
  from t
order by date1, n

...
Рейтинг: 0 / 0
12.10.2020, 11:04
    #40007621
ARRay001
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление результатов других запросов в выдачу основного запроса (табличный вид)
Правильный Вася,
'Доп строка 1' - это литерал в 1 поле доп. строки. (см. решение ниже). От даты меняется матем. формула, это не смертельно.
...
Рейтинг: 0 / 0
12.10.2020, 11:06
    #40007624
ARRay001
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление результатов других запросов в выдачу основного запроса (табличный вид)
graycode,
спасибо! Я был близок к подобному решению, но медленно думаю в SQL пока что. Адаптирую под себя - если что - напишу...
...
Рейтинг: 0 / 0
12.10.2020, 17:03
    #40007790
ARRay001
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление результатов других запросов в выдачу основного запроса (табличный вид)
Код: 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.
with t1 (id, n, date1, fld2, fld3) as
(
              select 1, 0, to_date('10.10.2020', 'DD.MM.YYYY'), 12, 34 from dual
    union all select 2, 0, to_date('11.10.2020', 'DD.MM.YYYY'), 56, 78 from dual
)
, dop1 (n, date1, str, fld2, fld3) as
(
    select 1, to_date('10.10.2020', 'DD.MM.YYYY'), 'Доп строка 1', 21, 43 from dual
)
, dop2 (n, date1, str, fld2, fld3) as
(
    select 2, to_date('10.10.2020', 'DD.MM.YYYY'), 'Доп строка 2', 2, 3 from dual
    union all
    select 2, to_date('11.10.2020', 'DD.MM.YYYY'), 'Доп строка 2', 7, 8 from dual
)
, dop3 (n, date1, str, fld2, fld3) as
(
    select 3, to_date('10.10.2020', 'DD.MM.YYYY'), 'Доп строка 3', 1, 4 from dual
    union all
    select 3, to_date('11.10.2020', 'DD.MM.YYYY'), 'Доп строка 3', 222, 5 from dual
)
, t (id, n, date1, str, fld2, fld3) as
(
select t1.id, n, t1.date1, to_char(t1.date1, 'DD.MM.YYYY'), t1.fld2, t1.fld3 from t1
union all
select t1.id, dop1.n, t1.date1, dop1.str, dop1.fld2, dop1.fld3
  from t1 join dop1 on t1.date1 = dop1.date1
union all
select t1.id, dop2.n, t1.date1, dop2.str, dop2.fld2, dop2.fld3
  from t1 join dop2 on t1.date1 = dop2.date1
union all
select t1.id, dop3.n, t1.date1, dop3.str, dop3.fld2, dop3.fld3
  from t1 join dop3 on t1.date1 = dop3.date1
)
select str
     , case when date1 = to_date('11.10.2020', 'DD.MM.YYYY') and n = 3 
            then t.fld2/2 else t.fld2 end as fld2
     , case when date1 = to_date('10.10.2020', 'DD.MM.YYYY') and t.fld2 = 21
            then (select 65 from dual) else t.fld3 end as fld3
  from t
order by date1, n



Не совсем то, но близко:
Надо, чтобы даты в допах были не конкретные, а брались из выдачи t1, а формулы считались по этим взятым датам уже потом. Ещё формула может включать суммы значений ячеек из разные строк. Короче имитация Excel. Может сам догадаюсь как переделать, может подскажете...
...
Рейтинг: 0 / 0
12.10.2020, 17:22
    #40007795
dmdmdm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление результатов других запросов в выдачу основного запроса (табличный вид)
Надо, чтобы даты в допах были не конкретные, а брались из выдачи t1

Можно хоть черта лысого навертеть.

Код: plsql
1.
2.
     case when n = 3 
            then (select max(date1) from t1) else (select trunc(date1, 'year') from t1 where fld2 = 12) end as fld2



Сопровождать этот ужас все равно вам.


Короче имитация Excel.

Может, Excel сымитирует сам Excel ?
...
Рейтинг: 0 / 0
12.10.2020, 17:38
    #40007798
ARRay001
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление результатов других запросов в выдачу основного запроса (табличный вид)
dmdmdm,

к сожалению, надо пока без Excel.
Внизу в формулах понятно, что можно навертеть.

Важно, что не получится написать так:
Код: plsql
1.
2.
3.
4.
, dop2 (n, date1, str, fld2, fld3) as
(
    select 2, to_date(t1.date1, 'DD.MM.YYYY'), 'Доп строка 2', 2, 3 from dual
)



или так:
Код: plsql
1.
2.
3.
4.
5.
, dop2 (n, date2, str, fld2, fld3) as
(
    select 2, to_date(date2, 'DD.MM.YYYY'), 'Доп строка 2', 2, 3 
    from dual d join t1 on d.date2 = t1.date1
)



всю схему запроса надо видоизменять...
...
Рейтинг: 0 / 0
12.10.2020, 17:47
    #40007799
graycode
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление результатов других запросов в выдачу основного запроса (табличный вид)
ARRay001,

Код: 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.
with t1 (id, n, date1, fld2, fld3) as
(
              select 1, 0, to_date('10.10.2020', 'DD.MM.YYYY'), 12, 34 from dual
    union all select 2, 0, to_date('11.10.2020', 'DD.MM.YYYY'), 56, 78 from dual
)
, dop (n, str) as
(
              select 1, 'Доп строка 1' from dual
    union all select 2, 'Доп строка 2' from dual
    union all select 3, 'Доп строка 3' from dual
    
)
, t (id, n, date1, str, fld2, fld3) as
(
select t1.id, n, t1.date1, to_char(t1.date1, 'DD.MM.YYYY'), t1.fld2, t1.fld3 from t1
union all
select t1.id, dop.n, t1.date1, dop.str, t1.fld2 + 11, t1.fld3 + 11 from t1, dop
)
select str
     , case when date1 = to_date('11.10.2020', 'DD.MM.YYYY') and n = 1 
            then t.fld2 * (lead(t.fld3 + 1) over (partition by date1 order by n))
            else t.fld2 
            end as calculated_fld2
     , case when date1 = to_date('10.10.2020', 'DD.MM.YYYY') and n = 3 
            then lag(t.fld3, 3) over (partition by date1 order by n) *
                 (select fld2 from t1 where id = 1) 
            else t.fld3 
            end as calculated_fld3
  from t
order by date1, n

...
Рейтинг: 0 / 0
12.10.2020, 18:08
    #40007803
ARRay001
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление результатов других запросов в выдачу основного запроса (табличный вид)
graycode,
Спасибо - супер!
...
Рейтинг: 0 / 0
12.10.2020, 18:31
    #40007809
ARRay001
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление результатов других запросов в выдачу основного запроса (табличный вид)
graycode,
как ещё с вами связаться? Есть одно деловое предложение. Здесь нет личных сообщений...
...
Рейтинг: 0 / 0
13.10.2020, 18:38
    #40008166
graycode
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление результатов других запросов в выдачу основного запроса (табличный вид)
ARRay001,

Я на такое не подпишусь, есть раздел работа, можете там разместить свое предложение, кто ни будь да и откликнется.
...
Рейтинг: 0 / 0
13.10.2020, 23:02
    #40008281
ARRay001
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление результатов других запросов в выдачу основного запроса (табличный вид)
graycode,
Насчет работы понятно, хотя мне кажется вам бы это не составило особенного труда.

Тогда вопрос по данному коду:
как, не указывая конкретные значения даты и id, выбрать для текущего поля (например calculated_fld3) значение определенной Доп строки (n) из строки до текущей и после текущей?
Понял только, что предыдущее значение fld3 без учета n можно найти так: lag(fld3,1) over (order by date1), а вот с определенной n как?
...
Рейтинг: 0 / 0
14.10.2020, 12:58
    #40008412
oragraf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление результатов других запросов в выдачу основного запроса (табличный вид)
ARRay001

как, не указывая конкретные значения даты и id, выбрать для текущего поля (например calculated_fld3) значение определенной Доп строки (n) из строки до текущей и после текущей?
Понял только, что предыдущее значение fld3 без учета n можно найти так: lag(fld3,1) over (order by date1), а вот с определенной n как?
Сначала для всех, потом вырезаешь только то, что тебе нужно
...
Рейтинг: 0 / 0
14.10.2020, 13:32
    #40008427
graycode
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление результатов других запросов в выдачу основного запроса (табличный вид)
ARRay001,

Для lag и lead есть offset, его можно использовать если вы всегда знаете из какой именно по счету строки по отношению к текущей нужно взять значение. Analytic Functions

Если вам нужно что то считать итеративно, можно пытаться прикрутить model, однако вам скорее всего будет намного проще и правильнее выгрузить подготовленные предварительные данные в коллекцию и просчеты сделать уже на коллекции используя императивный язык программирования.

Ну и скорее всего самый правильный вариант, это выгрузить предварительно подготовленную выборку в Excel и уже встроенным VB забить в расчетные ячейки формулы, так по крайней мере пользователь будет понимать откуда взялась такая цифра в ячейке.
...
Рейтинг: 0 / 0
14.10.2020, 15:28
    #40008494
ARRay001
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление результатов других запросов в выдачу основного запроса (табличный вид)
graycode,
про offset я знаю (спасибо за ссылку), но это же смещение внутри группы. А у нас получается две группы - сначала по date1, а внутри неё уже по n. Как сделать такую выборку?

Про model смотрел, но что-то не совсем разобрался, подойдет ли она для моего случая.

Если не получится сделать так (SQL) - придётся грубо копаться в коллекциях и пайповых функциях.

В Excel пока нельзя, т.к. туда выгружается уже готовый отчёт из системы отчетов.
...
Рейтинг: 0 / 0
14.10.2020, 18:14
    #40008582
graycode
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление результатов других запросов в выдачу основного запроса (табличный вид)
ARRay001
но это же смещение внутри группы.

Код: plsql
1.
over (partition by date1 order by n)


поменять на
Код: plsql
1.
over (order by date1, n)


либо, если получится выделить группы по какому то правилу, сделать синтетический идентификатор для окон и его указывать в partition by.

PS: если у вас цепочки расчетов, т.е. необходимо для расчета следующей группы иметь результат расчета предыдущей, то делайте в PL/SQL.
...
Рейтинг: 0 / 0
14.10.2020, 21:49
    #40008646
ARRay001
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление результатов других запросов в выдачу основного запроса (табличный вид)
graycode,

lag(fld3,3) over (order by date1,n) к сожалению не подходит, т.к. берёт значение fld3, а не установленное в ходе работы запроса предыдущее значение fld3.n3. Или что надо указать в левой части lag(fld3,3)?

да, цепочка, но на ближайшие группы (одна до и одна после). Т.е. например, calculated_fld3.n1тек_группы = calculated_fld3.n3пред_группы. Только pl/sql?

сделать сквозную нумерацию, которую можно было бы использовать, пока не получилось, но бьюсь...
...
Рейтинг: 0 / 0
14.10.2020, 23:52
    #40008666
ARRay001
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление результатов других запросов в выдачу основного запроса (табличный вид)
graycode,

получается, что надо использовать результаты, полученные в предыдущих итерациях цикла запроса - это скорее всего в SQL не выйдет. Если есть такой способ - это будет очень наворочено. Ещё подумаю немного и скорее всего перейду на pl/sql, как бы этого не хотелось избежать
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Добавление результатов других запросов в выдачу основного запроса (табличный вид) / 25 сообщений из 26, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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