2014-05-09 1 views
0

SQL Server 2005 데이터베이스 (기본 설치)에 넣으려는 재무 문제가 있습니다. 작년 같은 분기에 분기 별 비교를하고 있습니다. 즉 (2013Q1 - 2012Q1)/20132Q1입니다. 위에서 설명한 바와 같이 분기별로 1 - 9의 순서 목록을 반환하는 쿼리를 작성할 수 있습니까? SQL 쿼리에서 서식을 사전에SQL to Mimic Excel

In data set 
QUART REV 
2011Q1 6,175,352 
2011Q2 6,591,067 
2011Q3 6,219,978 
2011Q4 6,189,939 
2012Q1 7,178,652 
2012Q2 6,731,467 
2012Q3 6,949,978 
2012Q4 6,679,939 
2013Q1 6,242,802 
2013Q2 6,421,902 
2013Q3 6,667,007 
2013Q4 6,575,004

Expected output 
QUART COMP 
1 0.1625 
2 0.0213 
3 0.1174 
4 0.0792 
5 -0.1304 
6 -0.0460 
7 -0.0407 
8 -0.0157 
덕분 ;-)

+1

첫 번째로 ... "QUART"열을 'Year'와 'Quarter'로 나누면 정말 많은 어려움을 겪을 수 있습니다. – Aron

답변

0

을 Excel을 모방하기 위해 노력하고 있기 때문에, 그것은 훨씬 쉽게되어있는 경우 분할 쿼트 :

create table t ( yr int not null , qt int not null , salary int not null , primary key (yr,qt))

insert into t (yr,qt,salary) values (2011,1,6175352) , (2011,2,6591067) , (2011,3,6219978) , (2011,4,6189939) , (2012,1,7178652) , (2012,2,6731467) , (2012,3,6949978) , (2012,4,6679939) , (2013,1,6242802) , (2013,2,6421902) , (2013,3,6667007) , (2013,4,6575004)

select row_number() over (order by yr, qt) as quart, comp from ( select t1.yr, t1.qt , (1.0*t1.salary - (select salary from t t2 where t2.yr = t1.yr - 1 and t2.qt = t1.qt) )/t1.salary comp from t t1 where t1.yr >= 2012 )

내 번호는 FR을 벗어나 넌 너의 것, 나는 조사하지 않은 이유가 있지만 그것은 당신에게 시작해야합니다.

+0

당신의 솔루션은 정말 나를 통해 물건을 볼 수있었습니다! 원래 게시에 있지 않은 다른 고려 사항 때문에 LEFT JOIN 두 개의 데이터 세트를 선택했습니다. 1 년 동안, 다른 1 년 전에. – user2888449

0

부지하지만, 운동은 재미 있었다. 일반적으로, 응용 프로그램 레벨 포맷 (예 : 반올림 등) 상승해야하지만, 당신은 ... 나는 위의 의견에 동의

/*sample data*/ 
DECLARE @T TABLE (Quart CHAR(6), Rev INT) 

INSERT INTO @T 
     (Quart, Rev) 
VALUES ('2011Q1', 6175352), 
     ('2011Q2', 6591067), 
     ('2011Q3', 6219978), 
     ('2011Q4', 6189939), 
     ('2012Q1', 7178652), 
     ('2012Q2', 6731467), 
     ('2012Q3', 6949978), 
     ('2012Q4', 6679939), 
     ('2013Q1', 6242802), 
     ('2013Q2', 6421902), 
     ('2013Q3', 6667007), 
     ('2013Q4', 6575004); 


/*query begins here 
    cte is used to parse quart column into years & quarters */ 

WITH cte 
      AS (SELECT Yr = CONVERT(SMALLINT, LEFT(Quart, 4)) 
         , Qt = RIGHT(Quart, 1) 
         , Rev 
       FROM  @T 
      ) 
/*join cte to itself to compare last year same quarter 
    ROW_NUMBER used to get sequential ordering 
    CONVERT to numeric and rounding to get formatting 
*/ 
    SELECT QUART = ROW_NUMBER() OVER (ORDER BY b.Yr 
      , b.Qt) , 
      COMP = CONVERT(NUMERIC(5,4), ROUND((a.Rev-b.Rev*1.0)/ b.Rev, 4)) 
    FROM cte a 
      JOIN cte b ON b.Qt = a.Qt 
          AND b.Yr = a.Yr - 1