Гость
Map
Форумы / Oracle [игнор отключен] [закрыт для гостей] / запрос на выборку строк как столбцов / 15 сообщений из 15, страница 1 из 1
02.11.2021, 14:30
    #40108809
kmskmskms
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос на выборку строк как столбцов
есть две таблицы (это сильно упрощённый пример)

ид имя пользователя
------------------------
1 иван
2 виктор

ид ид_пользователя одежда тип
----------------------------------------------------
1 1 рубашка белая
2 1 брюки чёрные
3 2 рубашка синяя


как составить запрос чтоб получить такую таблицу:

пользователь рубашка брюки
---------------------------------------------------------
иван белая чёрные
виктор синяя <null>

желательно чтоб не прибегать ко вложенным полноразмерным SELECT на запрос каждого типа одежды ибо это буду практически одинаковые SELECT и очень очень длинные в оригинале
...
Рейтинг: 0 / 0
02.11.2021, 14:45
    #40108810
PuM256
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос на выборку строк как столбцов
kmskmskms,

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
with users(id, username) as (
    select 1, 'иван' from dual union all
    select 2, 'виктор' from dual
),
clothes(id, userid, clothes, type) as (
    select 1, 1, 'рубашка', 'белая' from dual union all
    select 2, 1, 'брюки', 'чёрные' from dual union all
    select 3, 2, 'рубашка', 'синяя' from dual
)
select * from (
    select username "пользователь", clothes, type from users u, clothes c where u.id = c.userid
)
pivot (
    max(type) for clothes in ('рубашка' "рубашка", 'брюки' "брюки")
)
...
Рейтинг: 0 / 0
03.11.2021, 11:41
    #40108920
kmskmskms
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос на выборку строк как столбцов
а какую роль тут играет max? зачем отбирать максимальное значение
...
Рейтинг: 0 / 0
03.11.2021, 11:46
    #40108924
PuM256
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос на выборку строк как столбцов
Если на вход подать такие данные:

ид ид_пользователя одежда тип
----------------------------------------------------
1 1 рубашка белая
2 1 рубашка синяя

Как определить, какую рубашку вывести в колонку "рубашка"?
...
Рейтинг: 0 / 0
03.11.2021, 12:18
    #40108931
kmskmskms
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос на выборку строк как столбцов
случайным образом, первую строку которая попадается в бд
...
Рейтинг: 0 / 0
03.11.2021, 13:03
    #40108936
PuM256
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос на выборку строк как столбцов
kmskmskms,

Это был риторический вопрос. Я так попытался объяснить, зачем нужен max.
...
Рейтинг: 0 / 0
03.11.2021, 13:05
    #40108937
kmskmskms
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос на выборку строк как столбцов
так всётаки можно както вместо MAX использовать чтото отбирающее первую попавшуюся строку. И второй вопрос, кроме PIVOT есть какойто способ получить подобную выборку, ведь раньше PIVOT не существовало, как делали такие выборки
...
Рейтинг: 0 / 0
03.11.2021, 13:09
    #40108938
oragraf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос на выборку строк как столбцов
kmskmskms,

max + decode + group by
...
Рейтинг: 0 / 0
03.11.2021, 13:10
    #40108939
Алымов Анатолий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос на выборку строк как столбцов
kmskmskms
так всётаки можно както вместо MAX использовать чтото отбирающее первую попавшуюся строку.

Можешь min или любую другую агрегатную функцию на свой вкус.
Без pivot можно использовать max + case например
...
Рейтинг: 0 / 0
03.11.2021, 13:18
    #40108941
PuM256
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос на выборку строк как столбцов
PIVOT - это 11g, ему уже более 10 лет. Но если очень нужно без него, то можно так:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
with users(id, username) as (
    select 1, 'иван' from dual union all
    select 2, 'виктор' from dual
),
clothes(id, userid, clothes, type) as (
    select 1, 1, 'рубашка', 'белая' from dual union all
    select 2, 1, 'брюки', 'чёрные' from dual union all
    select 3, 2, 'рубашка', 'синяя' from dual
)
select 
    username "пользователь", 
    max(case clothes when 'рубашка' then type end) "рубашка",
    max(case clothes when 'брюки' then type end) "брюки"
from users u, clothes c where u.id = c.userid
group by username



Что касается случайной записи вместо max... Что-то сложно представить, в какой ситуации полезен запрос, возвращающий разный результат при каждом запуске. Это вам в казино, а не в СУБД.

Но чисто гипотетически - можно сделать подзапрос, с удалением дубликатов с помощью row_number, dense_rank, и т.п. В окне сделать сортировку по dbms_random.value (или вообще по null, если никакая не нужна). А потом уже из этого подзапроса доставать данные моим прошлым запросом. Но это всё лишние приседания и сортировки непонятно ради чего.
...
Рейтинг: 0 / 0
03.11.2021, 13:29
    #40108942
kmskmskms
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос на выборку строк как столбцов
PuM256, ок, оба примера не выведут пользователя, если у него нет вещей так как идёт жёсткая привязка where u.id = c.userid. Как поменять выборку чтоб пользователь выводился в любом случае?
...
Рейтинг: 0 / 0
03.11.2021, 13:42
    #40108944
PuM256
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос на выборку строк как столбцов
...
Рейтинг: 0 / 0
03.11.2021, 14:01
    #40108952
kmskmskms
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос на выборку строк как столбцов
только джойнами значит, ок
...
Рейтинг: 0 / 0
03.11.2021, 14:04
    #40108953
PuM256
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос на выборку строк как столбцов
Джоин-то и так есть, нужно превратить inner join в outer join:

where u.id = c.userid(+)

Ну или аналогично через left join.
...
Рейтинг: 0 / 0
03.11.2021, 14:27
    #40108962
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос на выборку строк как столбцов
kmskmskms

если у него нет вещей


есть весчь

для 4 3 шорты красные

что надо вывести?

.....
stax
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / запрос на выборку строк как столбцов / 15 сообщений из 15, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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