Вы не можете сделать это без динамического SQL.Вот запрос, который даст вам желаемый результат.Мы с радостью раскомментируем бит --INTO #t
, однако неясно, что вы хотите сделать с таблицей #tevent, за исключением этого (если вы сообщите нам конечный результат, вместо «Я хочу добавить имя столбца как @столбец, может быть, мы можем помочь с этим тоже.) Чтобы продолжить ссылаться на эту таблицу #t, вам нужно будет продолжать использовать код в той же области видимости - то есть более динамический SQL, который выполняется в рамках того же самого вызова sp_executesql
.
DECLARE
@start DATE = '2012-01-02',
@end DATE = '2012-01-08';
DECLARE
@sql NVARCHAR(MAX) = N'',
@colMax NVARCHAR(MAX) = N'',
@colNames NVARCHAR(MAX) = N'';
;WITH x(rn) AS ( SELECT TOP (DATEDIFF(DAY, @start, @end) + 1) ROW_NUMBER()
OVER (ORDER BY [object_id]) - 1 FROM sys.all_columns ),
y(d) AS ( SELECT CONVERT(CHAR(10), DATEADD(DAY, rn, @start)) FROM x
)
SELECT @colMax += N',' + CHAR(13) + CHAR(10)
+ QUOTENAME(d) + ' = SUM(CASE WHEN DailyEnd = '''
+ d + ''' THEN TotalDailyTransactions ELSE 0 END)',
@colNames += N',' + QUOTENAME(d) FROM y;
SET @sql = 'SELECT StoreID, StoreName, ' + STUFF(@colNames, 1, 1, '')
+ ' --INTO #t
FROM ( SELECT StoreID, StoreName, ' + STUFF(@colMax, 1, 1, '')
+ ' FROM dbo.daily_trans
WHERE DailyEnd >= ''' + CONVERT(CHAR(10), @start) + ''''
+ ' AND DailyEnd < ''' + CONVERT(CHAR(10), DATEADD(DAY, 1, @end)) + '''
GROUP BY StoreID, StoreName
UNION ALL SELECT StoreID, StoreName, ' + STUFF(@colMax, 1, 1, '')
+ ' FROM dbo.outlets
WHERE DailyEnd >= ''' + CONVERT(CHAR(10), @start) + ''''
+ ' AND DailyEnd < ''' + CONVERT(CHAR(10), DATEADD(DAY, 1, @end)) + '''
GROUP BY StoreID, StoreName) AS x';
PRINT @sql;
-- EXEC sp_executesql @sql;