コメントで更新されたとおり。
最初の CTE は、奇数と偶数のみを生成することです。
デフォルトでは、許可される再帰の最大数は 100 であることを思い出してください。
そのため、@I の値を最初のテーブルのレコード数に設定しています。
「OPTION (MAXRECURSION 0);」にも注意してください。これは、レコード数がたまたま 100 を超えた場合に必要であり、その場合、再帰が何度も発生します。
DECLARE @widget TABLE
(
widgetID INT
,widgetName sysname
,WidgetType sysname
)
DECLARE @categoryAvg TABLE
(
WidgetType sysname
,categoryAvg sysname
)
INSERT INTO @widget( widgetID, widgetName,WidgetType )
SELECT 1,'widget1','Wtype1'
UNION ALL SELECT 2,'widget2','Wtype1'
UNION ALL SELECT 2,'widget3','Wtype2'
UNION ALL SELECT 2,'widget4','Wtype2'
INSERT INTO @categoryAvg( WidgetType, categoryAvg )
SELECT 'Wtype1',10 UNION ALL SELECT 'Wtype2',20
declare @i int=100--MAX 100 ByDefault
declare @StartOdd int=1 --To generate ODD numbers
declare @StartEven int=2 --To generate EVEN numbers
SELECT @i = COUNT(*) From @widget
;WITH CTE_OE(Rowid,OddNum,EvenNum)
as
(
select 1,@StartOdd,@StartEven
union all
select t1.rowid+1,t1.OddNum+2,t1.EvenNum+2
from CTE_OE t1
where t1.rowid<@i
),
CTE_1(WidgetType,OutputColumn,RowID)
AS
(
SELECT t1.WidgetType,t1.OutputColumn,t2.OddNum
FROM
(
SELECT WidgetType
,widgetName As OutputColumn
,ROW_NUMBER() OVER (ORDER BY widgetName,WidgetType) RowID
FROM @widget
)t1
JOIN CTE_OE t2
ON t1.RowID=t2.Rowid
),
CTE_2(OutputColumn,RowID)
AS
(
Select t1.OutputColumn
,t2.EvenNum
From
(
SELECT 'Type'+ ' = ' + q1.WidgetType + ', Avg = ' + q1.categoryAvg As OutputColumn
,ROW_NUMBER() OVER (ORDER BY q1.WidgetType) AS RowID
FROM @categoryAvg q1
JOIN CTE_1 q2
on q1.WidgetType=q2.WidgetType
)t1
JOIN CTE_OE t2
ON t1.RowID=t2.Rowid
)
Select OutputColumn
From
(
Select OutputColumn,RowID from CTE_1
union all
select OutputColumn,RowID from CTE_2
)qry
order by RowID
OPTION (MAXRECURSION 0);
