Для SQL Server 2005, 2008
таблицы и некоторые данные для тестирования
CREATE TABLE CompetitorDetail
(
ID int
,CompetitorID int
,oDate datetime
,Price decimal(19, 4)
)
INSERT INTO CompetitorDetail
(ID, CompetitorID, oDate, Price)
SELECT 1, 1, '2010-01-01', 100.0 UNION
SELECT 2, 1, '2010-01-02', 110.0 UNION
SELECT 3, 1, '2010-01-03', 99.0 UNION
SELECT 4, 2, '2010-01-01', 102.2 UNION
SELECT 5, 2, '2010-01-02', 112.2 UNION
SELECT 6, 2, '2010-01-03', 99.2 UNION
SELECT 7, 3, '2010-01-01', 100.3 UNION
SELECT 8, 3, '2010-01-02', 110.3 UNION
SELECT 9, 3, '2010-01-03', 99.3 ;
Начала периода и количества дней
/* First day of the peroid */
DECLARE @StartDate datetime
,@NumberOfDays int
SET @StartDate = '2010-01-01'
SET @NumberOfDays = 31
Динамических столбцов = динамических sql
/* Table to compose dynamic query */
DECLARE @qw TABLE
(
id int IDENTITY(1, 1)
,txt nvarchar(500)
)
/* Start composing dynamic query */
INSERT INTO @qw (txt) VALUES ('SELECT')
INSERT INTO @qw (txt) VALUES ('CompetitorID')
Продолжить слагающих динамический запрос
/* Helpers */
DECLARE
@dte datetime
,@str varchar(10)
,@i int
/* Compose dynamic query */
SET @i = 0
WHILE @i < @NumberOfDays
BEGIN
SET @dte = DATEADD(d, @i, @StartDate)
SET @str = CONVERT(varchar(10), @dte, 121)
INSERT INTO @qw (txt)
SELECT ',MAX(CASE oDate WHEN ''' + @str + ''' THEN Price ELSE NULL END) AS [' + @str + ']'
SET @i = @i + 1
END
/* Finish the dynamic query */
INSERT INTO @qw (txt) VALUES ('FROM CompetitorDetail')
INSERT INTO @qw (txt) VALUES ('GROUP BY CompetitorID')
INSERT INTO @qw (txt) VALUES ('ORDER BY CompetitorID')
Concatenate в переменную и выполнить
/* Create a variable with dynamic sql*/
DECLARE @exe nvarchar(4000)
SET @exe=''
SELECT @exe = @exe + txt + ' ' FROM @qw ORDER BY id
/* execute dynamic sql */
EXEC sp_executesql @exe
Возвращает
CompetitorID 2010-01-01 2010-01-02 2010-01-03 2010-01-04 ... 2010-01-31
------------ ---------- ---------- ---------- ---------- ... ----------
1 100.0000 110.0000 99.0000 NULL ... NULL
2 102.2000 112.2000 99.2000 NULL ... NULL
3 100.3000 110.3000 99.3000 NULL ... NULL
Вы хотите показать это только в течение определенного месяца или за все месяцы/дни? Должен ли он показывать столбцы в течение дней, когда нет записей? Будет ли это динамическим, или для фиксированных столбцов и дат * (например, вы хотите видеть только значения за январь 2009 года) *? Вам нужно показать некоторые примерные данные и ожидаемый результат. –
Я показал результат. Пользователь будет вводить год и месяц, и запрос приведет к вышеуказанному формату, то есть конкурентам в первом столбце и остальной части столбцов будут даты (от 1 до 31) за этот год и месяц. – hotcoder