2015-05-01 4 views
0

Я пытаюсь преобразовать столбец в строки. Я начинаю PIVOT. Пробовали ниже кода, но ошибка возникает как 'Ошибка преобразования типа данных nvarchar в datetime. Неверное значение «Tot_GPS_Cnt» предоставляется в операторе PIVOT.Несколько столбцов в SQL Server 2008

CREATE TABLE #tbl_Res1 
( 
    CallDate DATETIME, 
    Tot_GPS_Cnt INT, 
    Tot_GND_Cnt INT, 
    Per_Ratio NUMERIC(10,2) 
) 

INSERT INTO #tbl_Res1 
SELECT '2015-04-24 00:00:00.000','40','26','65.00' UNION ALL 
SELECT '2015-04-25 00:00:00.000','22','14','63.64' UNION ALL 
SELECT'2015-04-26 00:00:00.000','27','21','77.78' UNION ALL 
SELECT'2015-04-27 00:00:00.000','41','23','56.10' 

Источник Таблица

enter image description here

Желаемая Выход

enter image description here

Я попытался с ниже запроса бушель неудачу. Пожалуйста помоги. Заранее спасибо

SELECT CallDate=col, Tot_GPS_Cnt, Tot_GND_Cnt, Per_Ratio 
FROM 
(select CallDate, col, value from #tbl_Res1 
    cross apply 
    ( 
    SELECT 'Tot_GPS_Cnt',cast(Tot_GPS_Cnt as varchar(10)) UNION ALL 
    SELECT 'Tot_GND_Cnt', cast(Tot_GND_Cnt as varchar(10)) UNION ALL 
    SELECT 'Per_Ratio', cast(Per_Ratio as varchar(10)) 
) c (col,value) 
) d 
PIVOT 
(
max(value) for CallDate in ([Tot_GPS_Cnt], [Tot_GND_Cnt], [Per_Ratio]) 
) as piv 

ответ

1

Правильный синтаксис для PIVOT является:

PIVOT 
( 
    <aggregation function>(<column being aggregated>)  
    FOR  
    [<column that contains the values that will become column headers>] 

    IN ([first pivoted column], [second pivoted column], 

    ... [last pivoted column]) 

) AS <alias for the pivot table> 

Таким образом, вы должны поместить значения даты не [Tot_GPS_Cnt], [Tot_GND_Cnt], [Per_Ratio] вместо поворотных колонок:

SELECT CallDate=col, [2015-04-24], [2015-04-25], [2015-04-26], [2015-04-27] 
FROM 
(select CallDate, col, value from #tbl_Res1 
    cross apply 
    ( 
    SELECT 'Tot_GPS_Cnt',cast(Tot_GPS_Cnt as varchar(10)) UNION ALL 
    SELECT 'Tot_GND_Cnt', cast(Tot_GND_Cnt as varchar(10)) UNION ALL 
    SELECT 'Per_Ratio', cast(Per_Ratio as varchar(10)) 
) c (col,value) 
) d 
PIVOT 
(
max(value) for CallDate in ([2015-04-24], [2015-04-25], [2015-04-26], [2015-04-27]) 
) as piv 
+0

Большое спасибо за решение. Можем ли мы сделать эту динамику, потому что данные таблицы используются для изменения/роста. –

+0

@ RonakVyas Ну, это другой вопрос. Вы можете взглянуть на * динамический поворот *. Здесь вы найдете множество примеров в SO. –

+0

Хорошо, конечно. Большое спасибо. Я буду работать над этим, чтобы сделать динамичным. –

0

Спасибо вы @Giorgos Betsos. Я просто сделал динамическое решение. Просто хотел поделиться со всеми.

DECLARE @coldata VARCHAR(500); 
DECLARE @sql VARCHAR(MAX); 

SELECT @coldata = COALESCE(@coldata + '], [', '') + CONVERT(VARCHAR(10),calldate,110) 
FROM #tbl_Res1; 
SELECT @coldata = '[' + @coldata +']'; 
SELECT @coldata; 


SET @sql = 'SELECT CallDate=col, ' + @coldata + ' 
    FROM 
    (SELECT CallDate, col, value FROM #tbl_Res1 
    cross apply 
    ( 
     SELECT ''Tot_GPS_Cnt'', CAST(Tot_GPS_Cnt as VARCHAR(10)) UNION ALL 
     SELECT ''Tot_GND_Cnt'', CAST(Tot_GND_Cnt as VARCHAR(10)) UNION ALL 
     SELECT ''Per_Ratio'', CAST(Per_Ratio as VARCHAR(10)) 
    ) c (col,value) 
) d 
    PIVOT 
    (
    MAX(value) FOR CallDate IN (' + @coldata + ') 
) as piv' 

    SELECT @sql; 

    EXECUTE (@SQL); 
Смежные вопросы