Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Запрос для получения отчета - не соображу... / 10 сообщений из 10, страница 1 из 1
08.06.2020, 15:46
    #39967113
Coder0
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос для получения отчета - не соображу...
Привет!
Нужно составить запрос, не соображу как... Условно говоря и сильно упрощая есть спортсмены, судьи и оценки, которые судьи выставляют.
Вот для наглядности скрипт создания таблиц с данными:
Код: 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.
-- спортсмены
create table t_athletes
(
    id number,
    name varchar(100)
);

-- судьи
create table t_referees
(
    id number,
    name varchar(100)
);

-- оценки
create table t_rating
(
    athlete_id number,
    referee_id number,
    val number
);

insert into t_athletes values (1, 'Smith');
insert into t_athletes values (2, 'Jones');
insert into t_athletes values (3, 'Davis');

insert into t_referees values (100, 'Ref Scott');
insert into t_referees values (200, 'Ref Tiger');

insert into t_rating values (1, 100, 2);
insert into t_rating values (1, 200, 5);

insert into t_rating values (2, 100, 5);
insert into t_rating values (2, 200, 4);

insert into t_rating values (3, 100, 1);
insert into t_rating values (3, 200, 3);



А вот такой должен быть результат:
Код: plaintext
1.
2.
3.
4.
5.
        | Ref Scott | Ref Tiger
--------+-----------+----------
Smith   |         2 |         5
Jones   |         5 |         4
Davis   |         1 |         3

Т.е. слева спортсмены, сверху судьи, на перекрестье - оценка выставленная судьей спортсмену
Как написать запрос для такого результата?
...
Рейтинг: 0 / 0
08.06.2020, 15:53
    #39967116
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос для получения отчета - не соображу...
pivot
...
Рейтинг: 0 / 0
08.06.2020, 16:05
    #39967123
Coder0
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос для получения отчета - не соображу...
andrey_anonymous,

Насколько мне помнится в операторе PIVOT требуется явно перечислить столбцы, а если количество судей не фиксировано? Сегодня 2 а завтра 10 ...
...
Рейтинг: 0 / 0
08.06.2020, 16:46
    #39967135
AlexFF__|
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос для получения отчета - не соображу...
Coder0,

Перед запуском запроса на выполнение ты уже должен иметь возвращаемый список столбцов, это не динамический параметр.
Но ты можешь создавать новый запрос для каждого выполнения исходя из своих данных.
...
Рейтинг: 0 / 0
08.06.2020, 16:48
    #39967137
exciter
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос для получения отчета - не соображу...
Coder0,

Вероятно, без динамического sql тут не обойтись .
...
Рейтинг: 0 / 0
08.06.2020, 17:01
    #39967141
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос для получения отчета - не соображу...
Coder0
andrey_anonymous,

Насколько мне помнится в операторе PIVOT требуется явно перечислить столбцы, а если количество судей не фиксировано? Сегодня 2 а завтра 10 ...


Это принципиальное ограничение SQL - Вы должны определить структуру датасета во время компиляции.
Решение Вашей задачи на SQL - скорее из разряда фокусов, чем рабочих решений, но таки возможно.
1.
Код: plsql
1.
2.
3.
4.
5.
6.
select *
  from t_rating
  pivot xml (
    sum(val) val
    for referee_id in (select id from t_referees)
  )



2. ODCITable на базе anydata/anydataset

3. Правильное решение - поручить логику презентации данных отчетной системе.
Волшебное слово - Crosstab.

4. Заюзать OLAP Option, MDX не имеет такого жесткого ограничения.
...
Рейтинг: 0 / 0
08.06.2020, 17:18
    #39967144
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос для получения отчета - не соображу...
Практически любой отчётник умеет делать шахматку, для этого не надо извращаться с
получением плоской таблицы одним запросом.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
08.06.2020, 17:22
    #39967146
Coder0
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос для получения отчета - не соображу...
Dimitry Sibiryakov,

Скажем так, это небольшая часть данных, которые мне нужно отдать по запросу с веб-сайта.
Я уже подумываю, создать временную таблицу и наполнять ее двойным циклом. Хотелось красивого решения.
не, так тоже не пойдет - кол-во столбцов неизвестно
...
Рейтинг: 0 / 0
08.06.2020, 17:37
    #39967148
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос для получения отчета - не соображу...
Coder0Хотелось красивого решения.

Красивое решение это простой запрос "select athlete_id, referee_id, val from t_rating" и
не менее простой цикл в PHP коде, который раскладывает эти данные по двумерному массиву
"result[athlete_id][referee_id] = val".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
10.06.2020, 16:12
    #39967929
Coder0
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос для получения отчета - не соображу...
В общем, остановился на таком варианте:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
select 
    ah.name, /*
    max(decode(re.id, 100, ra.val, 0)) "Ref Scott",
    ... колонки формируем динамически
    */
from t_athletes ah
inner join t_rating ra   on ra.athlete_id = ah.id
inner join t_referees re on re.id = ra.referee_id
group by ah.id, ah.name


Колонки формируем динамически, пробежавшись по таблице t_referees , и сформированный запрос выполняем execute immediate
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Запрос для получения отчета - не соображу... / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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