Использование переменных в качестве держателей столбца места в запросе 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 нет.
Для того, чтобы добавить 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
Результат:
Можно обобщить 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
Это приводит к следующему результату. Хотя вы потеряли заголовки столбцов в качестве дат, вы получаете возможность изменять дату, изменяя одну переменную.
Чтобы устранить ошибку новообращенного, вам нужно объявить @ Week1, @ Week2 и т.д. переменные как 'datetime' и установить их значение, используя формат:' 2015-12-6 00:00:00 '. –
Я уже пробовал это. Но это показывает ту же ошибку. И все параметры и переменные являются только форматом datetime. – Anu