() Грубо говоря у тебя есть вертикальная таблица со свойствами к объекту. Тебе нужно развернуть (трансформировать) вертикальную таблицу со свойствами в горизонтальную. Это стандартная задача. В том же MS SQL это задача решается с помощью PIVOT. Обратная задача, когда нужно из горизонтальной таблицы построить вертикальную решается с помощью UNPIVOT.
Пример:
WITH vt_data as (
sel ect 'ob_1' as o, 1 as s, 11 as z
UNI ON ALL sel ect 'ob_1', 2, 12
UNI ON ALL select 'ob_1', 3, 13
UNI ON ALL select 'ob_1', 8, 18
UNI ON ALL select 'ob_1', 9, 19
UNI ON ALL select 'ob_2', 5, 25
UNI ON ALL select 'ob_3', 1, 31
UNI ON ALL select 'ob_3', 2, 32
UNI ON ALL select 'ob_4', 1, 41
UNI ON ALL select 'ob_4', 2, 42
UNION ALL sel ect 'ob_5', 1, 51
UNION ALL sel ect 'ob_5', 2, 52
UNION ALL sel ect 'ob_5', 7, 57
UNION ALL sel ect 'ob_6', 3, 63
UNION ALL sel ect 'ob_7', 3, 73
UNION ALL sel ect 'ob_7', 5, 75
UNION ALL sel ect 'ob_8', 2, 82
)
SEL ECT o, [1] AS svo_1, [2] AS svo_2, [3] AS svo_3, [4] AS svo_4, [5] AS svo_5
FR OM (sel ect * fr om vt_data where s IN (1,2,3,4,5)) as p
PIVOT (max(z) FOR s IN ([1], [2], [3], [4], [5])) AS pvt
ORDER BY o
Показать
WITH vt_data - это генерация самих данных, где <о> это объект, s - это свойство, z - значение. Использовал простые типы.
В данных есть свойства и 7 и 8 и 9, но они не будут попадать в результат даже если убрать условие "where s IN (1,2,3,4,5)".
Результат:
o svo_1 svo_2 svo_3 svo_4 svo_5
ob_1 11 12 13 NULL NULL
ob_2 NULL NULL NULL NULL 25
ob_3 31 32 NULL NULL NULL
ob_4 41 42 NULL NULL NULL
ob_5 51 52 NULL NULL NULL
ob_6 NULL NULL 63 NULL NULL
ob_7 NULL NULL 73 NULL 75
ob_8 NULL 82 NULL NULL NULL
Показать
В 1С PIVOT не поддерживается, но можно одной выборкой получить такой же результат. Отработает чуть медленнее чем PIVOT. Зато гораздо быстрее, чем несколько левых соединений.
SELECT
t.o
,max(CASE WHEN t.s=1 THEN t.z ELSE NULL END) as svo_1
,max(CASE WHEN t.s=2 THEN t.z ELSE NULL END) as svo_2
,max(CASE WHEN t.s=3 THEN t.z ELSE NULL END) as svo_3
,max(CASE WHEN t.s=4 THEN t.z ELSE NULL END) as svo_4
,max(CASE WHEN t.s=5 THEN t.z ELSE NULL END) as svo_5
FR OM vt_data as t
WH ERE t.s in(1,2,3,4,5)
GROUP by t.o
Показать
Если не нравятся NULL, то обернуть в ЕстьNULL( , <значение по умолчанию>)