powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Запрос для получения отчета - не соображу...
10 сообщений из 10, страница 1 из 1
Запрос для получения отчета - не соображу...
    #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
Запрос для получения отчета - не соображу...
    #39967116
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pivot
...
Рейтинг: 0 / 0
Запрос для получения отчета - не соображу...
    #39967123
Coder0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andrey_anonymous,

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

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

Вероятно, без динамического sql тут не обойтись .
...
Рейтинг: 0 / 0
Запрос для получения отчета - не соображу...
    #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
Запрос для получения отчета - не соображу...
    #39967144
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Практически любой отчётник умеет делать шахматку, для этого не надо извращаться с
получением плоской таблицы одним запросом.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Запрос для получения отчета - не соображу...
    #39967146
Coder0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,

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


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