Преобразование строк в столбцы с использованием "Pivot" в mssql, когда столбцы представляют собой строковый тип данных

Мне нужно знать, может ли "pivot" в MS SQL использоваться для преобразования строк в столбцы, если нет функции агрегата, которая будет использоваться. Я видел множество примеров только с агрегатной функцией. мои поля являются строковыми типами данных, и мне нужно преобразовать данные этой строки в данные столбца. Вот почему я написал этот вопрос. Я просто сделал это с "случаем". Может кто-нибудь мне помочь...... Спасибо заранее.

Ответ 1

Вы можете использовать PIVOT для выполнения этой операции. При выполнении PIVOT вы можете сделать это одним из двух способов: с помощью Static Pivot вы будете кодировать строки для преобразования или Dynamic Pivot, которые будут создавать список столбцов во время выполнения:

Static Pivot (см. SQL Fiddle with Demo):

SELECT *
FROM
(
  select empid, wagecode, amount
  from t1
) x
pivot
(
  sum(amount)
  for wagecode in ([basic], [TA], [DA])
) p

Динамический поворот:

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

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(wagecode) 
                  FROM t1 
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT empid, ' + @cols + ' from 
             (
                 select empid, wagecode, amount
                 from t1
            ) x
            pivot 
            (
                sum(amount)
                for wagecode in (' + @cols + ')
            ) p '

execute(@query)

Оба из них дадут вам те же результаты

Ответ 2

примерный формат

empid   wagecode   составляют
1               basic             1000
1               ТА               500
1                                 500
2                             1500
2                              ;   750
2               DA               750

EmpID     basic     TA     DA
1                     500     500
2                 1500         750       750

ОТВЕТ, КОТОРЫЙ Я ПОЛУЧИЛ

   SELECT empID , [1bas] as basic, [1tasal] as TA,[1otsal] as DA
   FROM (
   SELECT empID, wage, amount
   FROM table) up
   PIVOT (SUM(amt) FOR wgcod IN ([1bas], [1tasal],[1otsal])) AS pvt
   ORDER BY empID 
   GO

Ответ 3

Попробуйте следующее:

SELECT empid AS EmpID     
, ISNULL(SUM(CASE wagecode WHEN 'basic' THEN Amount ELSE 0 END), 0) AS Basic         
, ISNULL(SUM(CASE wagecode WHEN 'ta' THEN Amount ELSE 0 END), 0) AS TA     
, ISNULL(SUM(CASE wagecode WHEN 'da' THEN Amount ELSE 0 END), 0) AS DA 
FROM Employee
GROUP BY empid