2013-04-11 56 views
0

我試圖實現 下面的SQL代碼(SQL服務器2008年),但不斷收到的語法問題,而試圖在我前面的帖子 how to create temp table while Joining multiple tables that have to be PIVOT 使用類似的代碼樞軸表,我現在很爲難並需要緊急修復。透視表-syntax問題

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

附近有語法錯誤 ' ':DECLARE @query AS NVARCHAR(MAX),@colsPivot作爲NVARCHAR(MAX)選擇@colsPivot = STUFF((SELECT',' + QUOTENAME(」 MEM'+ cast(MEMPER_Instance as varchar(10))+''+ REPLACE(c.name,'MEMPER',''))from MEM_TEMP t cross應用sys.columns as C where C.object_id = object_id(' MEM_TEMP')和C.name不在('MEMPER_Instance','AHS_ID')組中,通過t.MEMPER_Instance,c.name order by t.MEMPER_Instance FOR XML PATH(''),TYPE).value('。',' (MEMPER_instance as varchar(10))+''_''將@query ='選擇*到#temp中(選擇ahs_id,''MEM'' + col col,來自(se (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)從MEM_TEMP開始計數)x univot(col in(MinValue,MaxValue,AvgValue,MedianValue,Count)的值)u)x1 pivot(max(value)for col in('+ @colspivot +'))p; select * from #temp'exec(@query)

如果有人能幫助我找出問題,我將不勝感激。 謝謝。

+0

如果你在短信2008,只需雙擊錯誤消息,它會直接到你的逗號。 – 2013-04-11 21:24:46

+0

@tonyHopkinson我在SMS 2008中試過了,它指向了FOR XML PATH(''),TYPE類型,我沒有看到任何不同的東西 – Rodricks 2013-04-11 21:56:05

回答

1

你必須在連續兩個逗號SELECT語句

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 2013-04-11 21:52:07

+0

請參閱我對上述評論以@tony。謝謝。 – Rodricks 2013-04-11 21:58:29

+0

@Rodricks發現了一些更多的錯誤...更新我的回答 – jhinkley 2013-04-11 22:03:26

1

您的腳本有幾個錯誤。

  • 你有你的子查詢一個額外的逗號後MEMPER_Instance,
  • 你有as重複多次在float轉換

腳本應該是:

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

+0

再次感謝。我根據Jhinkley糾正了我的劇本。真的很感謝你抽出寶貴時間幫我解決這個問題。 – Rodricks 2013-04-12 06:51:31

+0

,由於數據透視表字段是特定數據類型,因此將其轉換回其原始數據類型的最佳方法是什麼?首先用結構創建一個表格,或者在每一列上使用Alter。但是我的#列有300個左右,有大約80萬行。謝謝。 – Rodricks 2013-04-16 18:37:48