2016-07-14 2 views
0

У меня возникли проблемы со следующей ситуацией: мне нужно выбрать 4 позиции для оператора, и мне нужно, чтобы эти позиции были повернуты как столбцы. База данных структурированы следующим образом: StatementId 1, 2, PositionId RepCurrValue 3. Например, для StatementId = 55 и для позиций = 58 ИЛИ 62 ИЛИ 67 ИЛИ 82 результат:PIVOT в SQL Server 2012 - новое для SQL

1 2 3 
----------------- 
55 58 146,8000 
55 62 59,9800 
55 67 800,0500 
55 82 136,7600 

и я хочу, чтобы это было

1 58  62  67  82 
--------------------------------------- 
55 146,8000 59,9800 800,0500 136,7600 

Большое спасибо за вашу поддержку.

ответ

0

Я сделал это упражнение с PIVOT таблицы, которые могут быть вам помочь, принимая во внимание заголовки столбцов, равное содержанию поля [2] и не обеспечивает повторяющиеся значения в колонке [2]:

DECLARE @cols AS NVARCHAR(MAX) 

SET @cols = STUFF((SELECT ',[' + convert(nvarchar,(t.[2])) + ']' AS ID 
FROM TB_1 t 
    FOR XML PATH(''), TYPE).value('.', 'varchar(max)'),1,1, '') 

DECLARE @query AS NVARCHAR(MAX); 

SET @query = N'SELECT p.[1],' + @cols + N' from 
      (
       SELECT [1],[2],[3] FROM TB_1 
      ) x 
      pivot 
      (
       max([3]) 
       for [2] in (' + @cols + N') 
      ) p 

      ' 
exec sp_executesql @query; 

ниже результата, полученного путем добавления дополнительного StatementId (56) и новые различные позиции (90,91), связанный с StatementId (56)

1 58   62  67   82   90  91 
55 146,8000 59,9800 800,0500 136,7600 NULL NULL 
56 NULL  NULL NULL  NULL  185,74 185,74 

не-динамическое решение может быть:

select * 
from 
(
    SELECT [1],[2],[3] FROM TB_1 
) x 
pivot 
(
    max([3]) 
    for [2] in ([58] , [62] , [67] , [82]) 
) p