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()을 분석하면서 시간을 보냈지 만, 누군가가 이것을 설명 할 수 있기를 바랬다.

답변

2

내가 @tbl에서 얻는 CTE과 같은 결과를 얻지 못합니다. CTE의 경우 모든 달은 JAN입니다. 다음과 같이 CTE 정의를 변경하는 경우 :

;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,t.month /*here there was cte.month*/, 
     isnull(t.value,cte.Value) 
    from cte 
    join @tbl t on t.id=cte.id and t.number=cte.number+1 
) 

그런 다음 동일한 결과가 나타납니다.

+0

클래식 PEBKAC. 너무 오랫동안 그것을 쳐다 보면서 그것은 starfields ...로 바뀌 었습니다. 도움에 감사드립니다. 참고 쿼리가 여기 http://stackoverflow.com/a/12716649/573261에 사용되었고 다른 CTE "기능"을 발견했다고 생각했습니다 – RichardTheKiwi

+0

@RichardTheKiwi - 도움이 될 수있어서 다행입니다. – Lamak