2016-03-07 3 views
2

Я хочу преобразовать приведенные ниже данные в pivot в SQL. (отображая «общие» значения для соответствующих столбцов «недели» и соответствующие им строки «имена»). При запуске sp это исключение:Ошибка преобразования типа данных в запрос PIVOT

Ошибка преобразования типа данных nvarchar в datetime.

И

Некорректное значение "@ Week1" поставляется в операторе PIVOT.

Click here to see data

И мой запрос:

[Name] [nvarchar](255) NULL, 
[Weeks] [DATETIME] NULL, 
[total] [float] NULL 

@Week1 = '12/6/2015' 
@Week2 = '12/13/2015' 
@Week3 = '12/20/2015' 
@Week4 = '12/27/2015' 

SELECT Name, @Week1 AS Week1, @Week2 AS Week2, @Week3 AS Week3, @Week4 AS Week4 
INTO #TempData 
FROM 
(
    SELECT Name, Weeks, total FROM #TempData2 
) Data 
PIVOT 
(
     SUM([total]) 
     FOR [Weeks] IN ([@Week1],[@Week2],[@Week3],[@Week4]) 
) Piv 

я представил тип данных, как datetime для всех столбцов, но он бросает nvarchar в datetime ошибка. Я пытался с некоторыми решениями, но не работал.

Спасибо за вашу помощь ...

+0

Чтобы устранить ошибку новообращенного, вам нужно объявить @ Week1, @ Week2 и т.д. переменные как 'datetime' и установить их значение, используя формат:' 2015-12-6 00:00:00 '. –

+0

Я уже пробовал это. Но это показывает ту же ошибку. И все параметры и переменные являются только форматом datetime. – Anu

ответ

1

Использование переменных в качестве держателей столбца места в запросе PIVOT не работает. Я могу производить большую часть результата вы после, используя следующий SQL-запрос:

SELECT 
    Name, 
    [2015-12-06 00:00:00] AS '12/6/2015', 
    [2015-12-13 00:00:00] AS '12/13/2015', 
    [2015-12-20 00:00:00] AS '12/20/2015', 
    [2015-12-27 00:00:00] AS '12/27/2015' 
FROM 
(
    SELECT Name, Weeks, total 
    FROM #TempData 
) Data 
PIVOT 
(
     SUM([total]) 
     FOR [Weeks] IN ([2015-12-06 00:00:00], [2015-12-13 00:00:00], [2015-12-20 00:00:00],[2015-12-27 00:00:00]) 
) Piv 

Производит вывод, показанный ниже, но, как вы увидите столбец Total нет.

Query Result

Для того, чтобы добавить Grand Total столбец, вам нужно создать производную таблицу, которая суммирует итоги, а затем присоединиться к нему. Что-то вроде:

SELECT T1.*, T2.GrandTotal 
FROM 
(
    SELECT 
     Name, 
     [2015-12-06 00:00:00] AS '12/6/2015', 
     [2015-12-13 00:00:00] AS '12/13/2015', 
     [2015-12-20 00:00:00] AS '12/20/2015', 
     [2015-12-27 00:00:00] AS '12/27/2015' 
    FROM 
    (
     SELECT Name, Weeks, total FROM #TempData 
    ) Data 
    PIVOT 
    (
     SUM([total]) 
     FOR [Weeks] IN 
     (
     [2015-12-06 00:00:00], [2015-12-13 00:00:00], 
     [2015-12-20 00:00:00], [2015-12-27 00:00:00] 
    ) 
    ) Piv 
) T1 
JOIN 
(
    SELECT Name, SUM(Total) AS GrandTotal 
    FROM #TempData 
    WHERE Weeks IN 
    (
    '2015-12-06 00:00:00', 
    '2015-12-13 00:00:00', 
    '2015-12-20 00:00:00', 
    '2015-12-27 00:00:00' 
) 
    GROUP BY Name 
) AS T2 ON T2.Name = T1.Name 

Результат:

Query with Grand Total column

Можно обобщить SQL, так что вам не придется держать набрав даты во много раз. В приведенной ниже SQL-команде я предположил, что вы хотите смежные недели, как в данных вашего примера:

DECLARE @StartDate datetime = '2015-12-06 00:00:00'; 
DECLARE @StartWeek int; 
SELECT @StartWeek = DATEPART(WEEK, @StartDate); 

SELECT Name, [0], [1], [2], [3] 
FROM 
(
    SELECT 
    Name, 
    DATEPART(WEEK, Weeks) - @StartWeek AS WeekNumber, 
    Total 
    FROM #TempData 
    WHERE DATEPART(WEEK, Weeks) BETWEEN @StartWeek AND (@StartWeek + 3) 
) Data 
PIVOT 
(
    SUM([total]) 
    FOR [WeekNumber] IN ([0], [1], [2], [3]) 
) Piv 

Это приводит к следующему результату. Хотя вы потеряли заголовки столбцов в качестве дат, вы получаете возможность изменять дату, изменяя одну переменную.

Query result

+0

Большое вам спасибо. Работает. – Anu

+2

Я был бы признателен, если бы вы согласились ответить тогда. –