Отображение значений из строк в столбцы в SQL Server - PullRequest
0 голосов
/ 15 сентября 2018

У меня в таблице ниже приведены примеры записей.

select value, FieldID 
from [values] 
where fieldid in (140996, 140997)

Выход:

value Fieldid
--------------
101    140996
102    140996
       140996
Louis  140997
Khan   140997
Akabar 140997

Я хочу отобразить указанные выше значения из строк в столбцы, как показано ниже. Fieldid является входным параметром, а столбцы значений содержат любые строки.

Пример вывода

Fieldid    value1  value2  value3
---------------------------------
140996      101     102       
140997      Louis   Khan   Akabar

Ответы [ 2 ]

0 голосов
/ 15 сентября 2018

Вы можете попробовать использовать функцию агрегирования условий make pivot.

;WITH CTE AS(
   SELECT  *,ROW_NUMBER() OVER(PARTITION BY FieldId ORDER BY FieldId) rn
   FROM  [values]
)

SELECT FieldId,
    MAX(CASE WHEN rn = 1 THEN value END),
    MAX(CASE WHEN rn = 2 THEN value END),
    MAX(CASE WHEN rn = 3 THEN value END)
FROM CTE
GROUP BY FieldId

sqlfiddle

EDIT

Если вы хотите, чтобы ваши столбцы создавались динамически.

Вы можете попробовать использовать динамический пивот.

с использованием CTE рекурсии сделать номер строки из минимальной строки в максимальную строку.

затем используйте агрегатную функцию SQL условия записи номера строки.

DECLARE @cols AS NVARCHAR(MAX) = '',
        @query AS NVARCHAR(MAX);


;WITH CTE AS(
   SELECT  *,ROW_NUMBER() OVER(PARTITION BY FieldId ORDER BY FieldId) rn
   FROM  [values]
), CTE2 AS (
   SELECT MIN(rn) minID,MAX(rn) maxID
   FROM CTE
   UNION ALL
   SELECT minID + 1,maxID
   FROM CTE2
   WHERE  minID + 1<=maxID
)

SELECT @cols = @cols + 'MAX(CASE WHEN rn ='+ cast(minID as varchar(5)) +' THEN value END) Value'+CAST(minID AS VARCHAR(5))+','
FROM CTE2

set @cols = substring(@cols,0,len(@cols))


set @query =  '
;WITH CTE AS(
   SELECT *,ROW_NUMBER() OVER(PARTITION BY FieldId ORDER BY FieldId) rn
   FROM  [values]
)
 SELECT FieldId,' + @cols + ' 
 FROM CTE
 GROUP BY FieldId'


execute(@query)

sqlfiddle

0 голосов
/ 15 сентября 2018

Вы можете PIVOT для пронумерованных столбцов, сгенерированных через CONCAT и ROW_NUMBER.

SELECT *
FROM
(
    SELECT FieldID, value, 
     CONCAT('value', ROW_NUMBER() OVER (PARTITION BY FieldId ORDER BY (select 0))) AS col
    FROM [values]
    -- WHERE fieldid IN (140996,140997)
) src
PIVOT
(
    MAX(Value)
    FOR col IN ([value1], [value2], [value3])
) pvt

Вы можете проверить это здесь

Обратите внимание, что заказ ничем не 'Гарантировать тот же порядок значений.Поэтому, если у таблицы есть первичный ключ, вы можете вместо этого упорядочить его.

...