2011-08-24 5 views
1

@startDate 및 @endDate 매개 변수가있는 저장 프로 시저에 대한 select 문이 필요합니다. 날짜 범위 매개 변수를 기준으로 월 ("8 월 2011") 형식으로 표시된 동적 열을 반환해야합니다. 예를 들어날짜 범위 당 동적 월 연도 열

, 경우 @StartDate = 2011 년 1 월 1 일 및 @endDate = 2011-03-01

과 같이 보일 것이다 결과 집합 :

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

함수를 복용 열 머리글에 해당하는 datetime이 데이터 행에 사용됩니다.

가능합니까? 피벗을 사용 하시겠습니까? 미리 답변 해 주셔서 감사합니다.

+0

그들은 항상 같은 해가 될 것 및/또는 월부터 시작하거나 달력 년 통과 할 수 있습니까? 그리고 제공되는 날짜는 항상 그 달의 첫 번째 날이 될 것이며 시간을 포함하지 않을 것입니까? SQL Server의 어떤 버전입니까? –

+0

어떤 버전의 SQL Server입니까? – JNK

+0

날짜 범위가 달력 연도를 이동할 수 있습니다. 매개 변수는 DATETIME에 시간을 포함하지 않습니다. 달의 날짜는 첫 번째 날짜가 아닌 유효한 날짜 일 수 있습니다. SQL Server 8.0.2039는 SQL Server 2000 – kenalacom

답변

2

테이블을 건드릴 필요가 없다고 가정하면 (모든 데이터는 기능에서 제공됩니다). SQL Server 2000의 로컬 NVARCHAR 변수의 제한은 4,000 자이므로 범위의 길이에주의해야합니다.

이 경우
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'); 
+1

Brilliant! 나는이 접근법을 좋아한다. 고마움, 아론. 나는 이것을 사용할 수있다. – kenalacom