2013-04-11 3 views
0

가 나는 다음 SQL 코드 (SQL Server 2008)를 구현하지만 내 이전 게시물 how to create temp table while Joining multiple tables that have to be PIVOT 에서 유사한 코드를 사용하여 테이블을 선회하는 동안 구문 문제가 계속 노력하고 지금은 난처한 상황에 빠진거야 긴급히 고쳐야합니다.PIVOT 테이블 - 구문 문제

http://sqlfiddle.com/#!3/100bd/4

잘못된 ','근처의 구문 : NVARCHAR (MAX)와 같은 @query 선언 @colsPivot NVARCHAR (MAX) = 선택 @colsPivot STUFF ((SELECT ''+ QUOTENAME ('로서 MEM_TEMP에서 크로스 (SYMBOL (10)) + ''+ REPLACE (c.name, 'MEMPER',)) 캐스팅 sys.columns C로 적용 MEM '+ cast (MEMPER_Instance varchar (10)) + 어디 Cobject_id = object_id t.MEMPER_Instance에 의해 t.MEMPER_Instance에 의해 t.MEMPER_Instance에 의해 ('MEMPER_Instance', 'AHS_ID') 그룹에 속하지 않는 C.name은 t.MEMPER_Instance에 의해 XML PATH (''), TYPE) .value ('.', ' NVARCHAR (MAX) '), 1,1,' ') set @query ='SELECT *를 #temp로 설정합니다 (select ahs_id, ''MEM ''+ cast (MEMPER_instance는 varchar (10)) + '' + col col, (se의 값 (MAMPER_AvgValue as float) AvgValue, 캐스트 (MEMPER_MedianValue as float) 중간 값, 캐스트 (MEMPER_Count as float) MEM_TEMP에서 센다.) x unpivot ((MinValue, MaxValue, AvgValue, MedianValue, Count)의 col에 대한 값) u) x1 pivot ('+ @colspivot +')의 col에 대한 pivot (최대 값) select * from #temp 'exec (@query)

누군가가 저를 도와 주시면 감사하겠습니다. 감사합니다. .

+0

If SMS 2008에 있습니다. 오류 메시지를 두 번 클릭하면 오류 쉼표로 바로 이동합니다. –

+0

@tonyHopkinson SMS 2008에서 시도하고 XML PATH (''), TYPE의 행을 가리키고 다른 문자가 전혀 표시되지 않습니다. – Rodricks

답변

1

당신은

select ahs_id, 
     MEMPER_Instance,   
     ,cast (MEMPER_MinValue as float) MinValue 
첫번째 캐스트 전에

추가 쉼표, 한 캐스트 후 2 귀하의 캐스트에 as as float))

select ahs_id, 
      MEMPER_Instance,   
      ,cast (MEMPER_MinValue as float) MinValue 
      ,cast (MEMPER_MaxValue as as float)) MaxValue 
      ,cast (MEMPER_AvgValue as float) AvgValue 
      ,cast (MEMPER_MedianValue as float) MedianValue 
      ,cast (MEMPER_Count as as float) Count 

가 해결하는 당신의 선택 문 중 하나의 행에 두 개의 쉼표를 4 개의 실수로 피들을 쳤습니다.

+0

여분의 쉼표는 제거했지만 여전히 키워드 근처에 잘못된 구문이 표시됩니다. ': – Rodricks

+0

위의 @tony에 대한 의견을 참조하십시오. 감사. – Rodricks

+0

@Rodricks가 실수를 몇 번 발견했습니다 ... 내 대답을 업데이트했습니다. – jhinkley

1

스크립트에 몇 가지 오류가 있습니다.

select * from MEM_TEMP; 

DECLARE @query AS NVARCHAR(MAX), 
    @colsPivot as NVARCHAR(MAX) 

select @colsPivot = STUFF((SELECT ',' 
         + quotename('MEM'+ cast(MEMPER_Instance as varchar(10))+'_'+REPLACE(c.name, 'MEMPER_', '')) 
        from MEM_TEMP t cross apply sys.columns as C 
        where C.object_id = object_id('MEM_TEMP') 
        and C.name not in ('MEMPER_Instance','AHS_ID') 
        group by t.MEMPER_Instance, c.name 
        order by t.MEMPER_Instance 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 


set @query 
    = ' SELECT * into ##temp 
     from 
     (
     select ahs_id, 
      ''MEM''+cast(MEMPER_instance as varchar(10))+''_''+col col, 
      value 
     from 
     (
      select ahs_id, 
      MEMPER_Instance  
      ,cast (MEMPER_MinValue as float) MinValue 
      ,cast (MEMPER_MaxValue as float) MaxValue 
      ,cast (MEMPER_AvgValue as float) AvgValue 
      ,cast (MEMPER_MedianValue as float) MedianValue 
      ,cast (MEMPER_Count as float) Count 

      from MEM_TEMP 
     ) x 
     unpivot 
     (
      value 
      for col in (
      MinValue, 
      MaxValue, 
      AvgValue, 
      MedianValue, 
      Count 
     ) 
     ) u 
    ) x1 
    pivot 
    (
     max(value) 
     for col in ('+ @colspivot +') 
    ) p ; ' 


exec(@query) 

select * 
from ##temp 

SQL Fiddle with Demo

를 참조하십시오
  • 당신은 당신이 as

스크립트는해야 당신의 float 전환이 여러 번 반복해야 MEMPER_Instance,

  • 후 하위 쿼리에 추가 쉼표를
  • +0

    다시 한 번 감사드립니다. Jhinkley를 기반으로 스크립트를 수정했습니다. 다시 한번 나를 도와 줄 시간을 내 주셔서 감사합니다. – Rodricks

    +0

    , 피벗 필드가 특정 데이터 유형이므로 원래 데이터 유형으로 다시 변환하는 가장 좋은 방법은 무엇입니까? 먼저 구조로 테이블을 만들거나 각 열에 대해 Alter를 사용하십시오. 하지만 내 # 열은 300 개 정도이고 약 800,000 개의 행이 있습니다. 감사. – Rodricks