Столбцы динамического месяца и года в диапазоне дат - PullRequest
1 голос
/ 25 августа 2011

Мне нужен оператор выбора для хранимой процедуры с параметрами @startDate и @endDate. Необходимо вернуть динамическое количество столбцов, помеченных в формате месяц-год («август 2011») на основе параметров диапазона дат.

Например, если @startDate = 01.01.2011 и @endDate = 3/1/2011

набор результатов будет выглядеть примерно так:

column headers ---->  January 2011 | February 2011 | March 2011
rows with data ---->       123     |      3456     |    793

функция, принимающая дату и время, соответствующие заголовку столбца, будет использоваться для строк данных

Возможно ли это? Использовать пивот? Заранее благодарим за все ваши ответы!

1 Ответ

2 голосов
/ 25 августа 2011

При условии, что вам не нужно трогать какие-либо таблицы (все данные поступают из функции). Обратите внимание, что ограничение на локальную переменную NVARCHAR в SQL Server 2000 составляет 4000 символов, поэтому вам нужно быть осторожным с тем, насколько большим может быть ваш диапазон.

DECLARE 
    @startDate SMALLDATETIME, 
    @endDate   SMALLDATETIME;

SELECT 
    @startDate = '20110101', 
    @endDate   = '20110301';


DECLARE 
    @i       INT,
    @sd      SMALLDATETIME,
    @sql     NVARCHAR(MAX),
    @column  VARCHAR(32),
    @columns NVARCHAR(4000);

SELECT @i = 0, @columns = N'';

WHILE @i <= DATEDIFF(MONTH, @startDate, @endDate)
BEGIN
    SET @sd = DATEDIFF(DAY, 0, DATEADD(MONTH, @i, @startDate));

    SET @column = DATENAME(MONTH, @sd) 
        + ' ' + CONVERT(VARCHAR(20), YEAR(@sd));

    SET @columns = @columns + ',' + CHAR(13) + CHAR(10) 
        + ' [' + @column + ']' + ' = dbo.FunctionName(''' + @column + ''')';

    SET @i = @i + 1;
END

SET @sql = 'SELECT ' + STUFF(@columns, 1, 1, '') + ';';

PRINT @sql;
--EXEC sp_executesql @sql;

В этом случае это дает:

SELECT 
 [January 2011] = dbo.FunctionName('January 2011'),
 [February 2011] = dbo.FunctionName('February 2011'),
 [March 2011] = dbo.FunctionName('March 2011');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...