SQL Fiddle
Перед обновлением ОП - если эти 4 значения находятся в разных столбцах одной и той же строке той же таблицы: Setup
Oracle 11g R2 Схема:
Запрос 1:
WITH data (z1, z2, z3, z4) AS (
SELECT 'bbb', 'aaa', 'ccc', 'ddd' FROM DUAL
)
SELECT LEAST(z1, z2, z3, z4) c1,
CASE WHEN z1 <= z2 AND z2 <= z3 AND z2 <= z4 THEN z2
WHEN z1 <= z3 AND z3 <= z2 AND z3 <= z4 THEN z3
WHEN z1 <= z4 AND z4 <= z2 AND z4 <= z3 THEN z4
WHEN z2 <= z1 AND z1 <= z3 AND z1 <= z4 THEN z1
WHEN z2 <= z3 AND z3 <= z1 AND z3 <= z4 THEN z3
WHEN z2 <= z4 AND z4 <= z1 AND z4 <= z3 THEN z4
WHEN z3 <= z1 AND z1 <= z2 AND z1 <= z4 THEN z1
WHEN z3 <= z2 AND z2 <= z1 AND z2 <= z4 THEN z2
WHEN z3 <= z4 AND z4 <= z1 AND z4 <= z2 THEN z4
WHEN z4 <= z1 AND z1 <= z3 AND z1 <= z4 THEN z1
WHEN z4 <= z2 AND z2 <= z1 AND z2 <= z3 THEN z2
WHEN z4 <= z3 AND z3 <= z1 AND z3 <= z2 THEN z3 END AS c2,
CASE WHEN z1 >= z2 AND z2 >= z3 AND z2 >= z4 THEN z2
WHEN z1 >= z3 AND z3 >= z2 AND z3 >= z4 THEN z3
WHEN z1 >= z4 AND z4 >= z2 AND z4 >= z3 THEN z4
WHEN z2 >= z1 AND z1 >= z3 AND z1 >= z4 THEN z1
WHEN z2 >= z3 AND z3 >= z1 AND z3 >= z4 THEN z3
WHEN z2 >= z4 AND z4 >= z1 AND z4 >= z3 THEN z4
WHEN z3 >= z1 AND z1 >= z2 AND z1 >= z4 THEN z1
WHEN z3 >= z2 AND z2 >= z1 AND z2 >= z4 THEN z2
WHEN z3 >= z4 AND z4 >= z1 AND z4 >= z2 THEN z4
WHEN z4 >= z1 AND z1 >= z3 AND z1 >= z4 THEN z1
WHEN z4 >= z2 AND z2 >= z1 AND z2 >= z3 THEN z2
WHEN z4 >= z3 AND z3 >= z1 AND z3 >= z2 THEN z3 END AS c3,
GREATEST(z1, z2, z3, z4) c4
FROM data
Results:
| C1 | C2 | C3 | C4 |
|-----|-----|-----|-----|
| aaa | bbb | ccc | ddd |
После обновления ОП - если эти 4 значения находятся в разных строках одной таблицы:
SQL Fiddle
Oracle 11g R2 Настройка схемы:
CREATE TABLE users (id, rk_id) AS
SELECT 5234, 1 FROM DUAL;
CREATE TABLE table_with_codes (rk_id, code, string_value) AS
SELECT 1, 'code1', 'bbb' FROM DUAL
UNION ALL SELECT 1, 'code2', 'ddd' FROM DUAL
UNION ALL SELECT 1, 'code3', 'aaa' FROM DUAL
UNION ALL SELECT 1, 'code4', 'ccc' FROM DUAL;
Запрос 2:
WITH ordered_codes (rk_id, idx, string_value) AS (
SELECT rk_id,
ROW_NUMBER() OVER (PARTITION BY rk_id ORDER BY string_value),
string_value
FROM table_with_codes
)
SELECT u.id,
MAX(CASE idx WHEN 1 THEN string_value END) AS c1,
MAX(CASE idx WHEN 2 THEN string_value END) AS c2,
MAX(CASE idx WHEN 3 THEN string_value END) AS c3,
MAX(CASE idx WHEN 4 THEN string_value END) AS c4
FROM users u
LEFT OUTER JOIN ordered_codes o
ON (u.rk_id = o.rk_id)
WHERE u.id = 5234
GROUP BY u.id
Results:
| ID | C1 | C2 | C3 | C4 |
|------|-----|-----|-----|-----|
| 5234 | aaa | bbb | ccc | ddd |
почему вы это делаете? выглядит странно для меня, какая ситуация понадобится для такого типа? : \ – MrSimpleMind
@MrSimpleMind, я редактировал свой пример. –