Если вы хотите передать в качестве параметра число кварталов;тогда запрос может быть построен динамически:
-- YOUR DATA:
-- ----------------------------------------------
select Quarterwise, Ship_Quantity, Failed_Quantity
into #Tab
from ( select 'Q4-2008' as Quarterwise, 0 as Ship_Quantity, 1 as Failed_Quantity
union all select 'Q1-2009', 0, 28
union all select 'Q2-2009', 0, 22
union all select 'Q3-2009', 0, 289
union all select 'Q4-2009', 0, 121
union all select 'Q1-2010', 11000,124
union all select 'Q2-2010', 0, 5
union all select 'Q3-2010', 0, 0
union all select 'Q4-2010', 0, 2
union all select 'Q1-2011', 0, 16
union all select 'Q2-2011', 0, 18 ) data
DECLARE @PARAMETER INT
SET @PARAMETER = 5
-- SOLUTION
-- ----------------------------------------------
DECLARE @QUERY1 NVARCHAR(MAX)
DECLARE @QUERY2 NVARCHAR(MAX)
SET @QUERY1 =
';with cte as
(
select
Quarterwise as Q,
Ship_Quantity as SQ,
Failed_Quantity as FQ,
substring(Quarterwise,4,4)+substring(Quarterwise,2,1) as ord from #Tab
)
select
T1.SQ as s1'
SET @QUERY2 =
'
from
cte T1'
DECLARE @i INT
DECLARE @istr NVARCHAR(4)
SET @i = 2
WHILE @i <= @PARAMETER
BEGIN
SET @istr = cast(@i as varchar)
SET @QUERY1 = @QUERY1 + ',
T'+@istr+'.SQ as s'+@istr
SET @QUERY2 = @QUERY2 + '
cross apply (select top 1 * from cte T'+@istr+' where T'+@istr+'.ord > T'+cast(@i-1 as varchar)+'.ord order by ord asc) T'+@istr
SET @i = @i + 1
END
SET @QUERY1 = @QUERY1 +',
T'+@istr+'.FQ as Fn'
-- RUN DYNAMIC QUERY
-- ----------------------------------------------
SET @QUERY1 = @QUERY1 + @QUERY2
EXEC sp_executesql @QUERY1
s1 s2 s3 s4 s5 Fn
----------- ----------- ----------- ----------- ----------- -----------
0 0 0 0 0 121
0 0 0 0 11000 124
0 0 0 11000 0 5
0 0 11000 0 0 0
0 11000 0 0 0 2
11000 0 0 0 0 16
0 0 0 0 0 18
-- CLEAN
-- ----------------------------------------------
drop table #Tab