powered by simpleCommunicator - 2.0.29     © 2024 Programmizd 02
Map
Форумы / Oracle [игнор отключен] [закрыт для гостей] / запрос на выборку строк как столбцов
15 сообщений из 15, страница 1 из 1
запрос на выборку строк как столбцов
    #40108809
kmskmskms
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
есть две таблицы (это сильно упрощённый пример)

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

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


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

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

желательно чтоб не прибегать ко вложенным полноразмерным SELECT на запрос каждого типа одежды ибо это буду практически одинаковые SELECT и очень очень длинные в оригинале
...
Рейтинг: 0 / 0
запрос на выборку строк как столбцов
    #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
запрос на выборку строк как столбцов
    #40108920
kmskmskms
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а какую роль тут играет max? зачем отбирать максимальное значение
...
Рейтинг: 0 / 0
запрос на выборку строк как столбцов
    #40108924
PuM256
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если на вход подать такие данные:

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

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

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

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

Можешь min или любую другую агрегатную функцию на свой вкус.
Без pivot можно использовать max + case например
...
Рейтинг: 0 / 0
запрос на выборку строк как столбцов
    #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
запрос на выборку строк как столбцов
    #40108942
kmskmskms
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PuM256, ок, оба примера не выведут пользователя, если у него нет вещей так как идёт жёсткая привязка where u.id = c.userid. Как поменять выборку чтоб пользователь выводился в любом случае?
...
Рейтинг: 0 / 0
запрос на выборку строк как столбцов
    #40108944
PuM256
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
запрос на выборку строк как столбцов
    #40108952
kmskmskms
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
только джойнами значит, ок
...
Рейтинг: 0 / 0
запрос на выборку строк как столбцов
    #40108953
PuM256
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Джоин-то и так есть, нужно превратить inner join в outer join:

where u.id = c.userid(+)

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

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


есть весчь

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

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

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


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