3
SQL Fiddle이 작동하지 않는 이유는 무엇입니까? 복제SQL Server 재귀 CTE 및 피벗이 함께 작동하지 않습니다.
전체 스크립트를
create table tbl (
id int,
month varchar(9),
value float);
insert tbl values
(1,'Jan',0.12),
(1,'Feb',0.36),
(1,'Mar',0.72),
(2,'Mar',0.11),
(2,'Apr',0.12),
(2,'May',0.36);
declare @tbl table (
id int,
number int,
month varchar(9),
value float);
insert @tbl
select id.id, Months.Number, Months.Name, t.value
from (values(1,'Jan'),
(2,'Feb'),
(3,'Mar'),
(4,'Apr'),
(5,'May'),
(6,'Jun')) Months(Number,Name)
cross join (select distinct id from tbl) id
left join tbl t on t.month = Months.name and t.id=id.id;
;with cte as (
select id,Number,month,isnull(Value,0.0)value
from @tbl
where Number=1
union all
select cte.id,cte.Number+1,cte.month,isnull(t.value,cte.Value)
from cte
join @tbl t on t.id=cte.id and t.number=cte.number+1
)
/*update t
set value=cte.value
from @tbl t
join cte on t.id=cte.id and t.number=cte.number;*/
select id, Jan,Feb,Mar,Apr,May,Jun
from (select id,month,value from /*@tbl*/ cte) p
pivot (max(value) for month in (Jan,Feb,Mar,Apr,May,Jun)) v;
예상 결과 :
ID JAN FEB MAR APR MAY JUN
1 0.12 0.36 0.72 0.72 0.72 0.72
2 0 0 0.11 0.12 0.36 0.36
실제 결과 : 당신이 주석 처리 된 코드의 주석을 해제하면
ID JAN FEB MAR APR MAY JUN
1 0.72 (null) (null) (null) (null) (null)
2 0.36 (null) (null) (null) (null) (null)
, 그것은 작동합니다. 그러나 직접 CTE에서 SELECT * FROM CTE
을 선택하면 UPDATE 문 다음에 @tbl
에있는 것과 동일한 값이 표시됩니다.
나는 CTE + ROW_NUMBER()을 분석하면서 시간을 보냈지 만, 누군가가 이것을 설명 할 수 있기를 바랬다.
클래식 PEBKAC. 너무 오랫동안 그것을 쳐다 보면서 그것은 starfields ...로 바뀌 었습니다. 도움에 감사드립니다. 참고 쿼리가 여기 http://stackoverflow.com/a/12716649/573261에 사용되었고 다른 CTE "기능"을 발견했다고 생각했습니다 – RichardTheKiwi
@RichardTheKiwi - 도움이 될 수있어서 다행입니다. – Lamak