Если вам нужен динамический запрос, который автоматически создает все столбцы для всех значений Date
, вы можете использовать динамический SQL, но помните о проблемах безопасности (внедрение SQL и т. Д.) Этого подхода!
Вот пример сценария, который динамически генерирует запрос со всеми столбцами для вашего Date
:
if OBJECT_ID('Test') is not null
drop table [dbo].[Test]
CREATE TABLE [dbo].[Test]([date] datetime, business_day int, total int, number int, number_2 int)
insert into [dbo].[Test] select '2018-04-03', 1, 325857, 0, 888
insert into [dbo].[Test] select '2018-04-04', 2, 196308, 2, 829
insert into [dbo].[Test] select '2018-04-05', 3, 434970, 1, 661
insert into [dbo].[Test] select '2018-04-06', 4, 665941, 1, 1135
insert into [dbo].[Test] select '2018-04-09', 5, 589334, 0, 837
declare @dates nvarchar(max)='' --this variable holds all the dates that will become column names
declare @sql nvarchar(max)='' --this variable contains the TSQL dinamically generated
select @dates = @dates + ', [' + CONVERT(char(10), [date],126)+ ']' from [dbo].[Test]
set @dates = RIGHT(@dates, len(@dates)-2)
set @sql = @sql + 'select col as [date], ' + @dates
set @sql = @sql + 'from '
set @sql = @sql + '( '
set @sql = @sql + ' select [date] , col,val,ord '
set @sql = @sql + ' from [dbo].[Test] '
set @sql = @sql + ' CROSS APPLY ('
set @sql = @sql + ' VALUES (''business_day'',business_day, 1), '
set @sql = @sql + ' (''total'',total, 2), '
set @sql = @sql + ' (''number'',number, 3), '
set @sql = @sql + ' (''number_2'',number_2, 4) '
set @sql = @sql + ' )CS (COL,VAL,ORD) '
set @sql = @sql + ') src '
set @sql = @sql + 'pivot ( max(val) for [Date] in (' + @dates + ') ) piv '
set @sql = @sql + 'order by ord'
exec(@sql)
Вот результат этого утверждения: