Преобразование столбцов в строку SQL
Доброго времени суток!
У меня есть две таблицы. В одной таблице содержаться значения, а в другой свойства этого значения и наименования свойств. У одного значения может быть несколько свойств, но с конкретным наименованием только одно свойство. Как мне вывести результат в единую таблицу, преобразовав строки в столбцы?
TABLE 1
ID DATA_TABLE1
1 data0
2 data1
TABLE 2
ID ID_FROM_TABLE_1 VALUE PROPERTY
1 0 1 unique0
2 0 2 unique1
3 0 1 unique2
4 1 1 unique0
5 1 2 unique1
6 1 3 unique4
Если осуществить подобный запрос:
SELECT table1.ID, DATA_TABLE1, VALUE, PROPERTY
FROM table1
LEFT JOIN table2
ON table1.ID = table2.ID_FROM_TABLE_1
Результат будет таким:
ID DATA_TABLE1 VALUE PROPERTY
1 data0 1 unique0
1 data0 2 unique1
1 data0 1 unique2
2 data1 1 unique0
2 data1 2 unique1
2 data1 3 unique4
А хотелось бы:
ID DATA PROP0 PROP1 PROP2 PROP4
1 data0 1 2 1 NULL
2 data1 1 2 NULL 3
Ответы (3 шт):
Мне в голову пришло только такое решение:
SELECT
table1.ID,
table1.[DATA_TABLE1] AS [table1 DATA],
(SELECT TOP(1) table2.value
FROM table2
WHERE table2.ID_FROM_TABLE_1=table1.id AND table2.property='unique0') AS 'PROP0',
(SELECT TOP(1) table2.value
FROM table2
WHERE table2.ID_FROM_TABLE_1=table1.id AND table2.property='unique1') AS 'PROP1',
(SELECT TOP(1) table2.value
FROM table2
WHERE table2.ID_FROM_TABLE_1=table1.id AND table2.property='unique2') AS 'PROP2',
(SELECT TOP(1) table2.value
FROM table2
WHERE table2.ID_FROM_TABLE_1=table1.id AND table2.property='unique4') AS 'PROP4'
FROM
table1
Но если я правильно понимаю, то получается, что на выбор каждой строки, совершается ещё 4 выбора
DECLARE
@columns NVARCHAR(MAX) = '',
@sql NVARCHAR(MAX) = '';
-- столбцы
SELECT
@columns+=QUOTENAME(REPLACE(t.PROPERTY, 'unique', 'PROP')) + ','
--@columns+=t.PROPERTY + ','
FROM
table2 t
GROUP BY t.PROPERTY
ORDER BY t.PROPERTY;
-- remove the last comma
SET @columns = LEFT(@columns, LEN(@columns) - 1);
--print @columns;
-- construct dynamic SQL
SET @sql ='
SELECT * FROM
(
SELECT
ID_FROM_TABLE_1 + 1 as ID,
ID_FROM_TABLE_1,
[VALUE],
REPLACE(PROPERTY, ''unique'', ''PROP'') as PROPERTY
FROM
table2
) t
PIVOT(
MIN(t.[VALUE])
FOR t.PROPERTY IN ('+ @columns +')
) AS pivot_table;';
-- execute the dynamic SQL
EXECUTE sp_executesql @sql;
а дальше уже сами имя таблицы для столбца DATA привяжите. решение для MS SQL
Предлагаю через CASE. Результирующая таблица будет немного отличаться , напоминать сводную Excel.
SELECT ID, DATATABLE_ID AS DATA,
(CASE WHEN VALUE=1 AND
PROPERTY=UNIQUE0
THEN 1 END) AS PROP0,
(CASE WHEN VALUE=2 AND
PROPERTY=UNIQUE1
THEN 2 END) AS PROP1,
(CASE WHEN VALUE=1 AND
PROPERTY=UNIQUE2
THEN 1 END) AS PROP2,
(CASE WHEN VALUE=3 AND
PROPERTY=UNIQUE4
THEN 3 END) AS PROP3
FROM \* созданная Вами таблица с LEFT JOIN *\