2012-08-07 106 views
1

我擁有192個獨立列的數據。它們是列對,因此有15分鐘時間片和質量控制編號的數據。現在設置每行的方式代表一天。我想插入數據到更少的列(日期,ReadTime,QualityControlNumber,閱讀,...)的另一個表中 我開始嘗試像這樣的while循環,但使用變量來更改列標題似乎不可能。將SQL列轉換爲ID爲的行

我應該巢while循環遞增欄標題或有另一種伎倆,我應該使用

代碼嘗試:

Declare @count varchar (10), 
    @QC varchar (10), 
    @Interval varchar(10) 
set @count = 1 
set @QC = 'QC#' + @count 
set @Interval = 'Interval#' + @count 

While (@count<97) 
    BEGIN 
     insert into Data_DATEstr (Number,[ReadDate],TimeInterval,QCReading,IntervalReading,ConversionFactor) 
     select [Number], [Start Date], @count, ['QC#'[email protected]], [Interval# [email protected]] ,[Conversion Factor] 
     from table 
     where [Number] = '103850581' 
      and [Start Date] = '060112' 

     set @count = (@count+1) 
    END 
+0

你可以發佈一些樣本數據,然後預期的結果? – Taryn 2012-08-07 20:12:57

+0

爲什麼你需要循環?你不能簡單地使用'INSERT INTO SecondTable(<第二個表的列>)SELECT <只是幾列> FROM OriginalTable WHERE <某些條件>' – 2012-08-07 20:16:12

+0

請不要將代碼示例粘貼到註釋中;它很難閱讀。請編輯該問題。 – 2012-08-07 20:19:58

回答

0

雖然你的問題是不完全清楚,這聽起來像你需要某種形式的操作類似於UNPIVOT。這可以讓你將列旋轉成行。我建議讀一下它,看看它是否適用於你 - 即使它不適用,它可能會提示一種可行的方法。

0

你想要的命令是不透明的。例如:

select Date, ReadTime, QualityControlNumber, Reading 
from t 
unpivot (Reading for date in (day1, . . . , dayn) as unpvt 

你會發現你不會真的得到日期,而是原來的列名。您可以通過將univot查詢放入子查詢(或CTE)中,然後使用字符串操作和強制將列名轉換爲日期來解決此問題。

1

沒有必要爲此使用while循環。你想要一個UNPIVOT如果你試圖將192個單獨的列轉換爲行,那麼你一定會想要使用UNPIVOT函數。這可以通過使用動態SQL,那麼你將有已編寫所有字段寫入:

DECLARE @cols AS NVARCHAR(MAX), 
    @query AS NVARCHAR(MAX) 

select @cols = stuff((select ','+quotename(C.name) 
     from sys.columns as C 
     where C.object_id = object_id('test') and 
       C.name like 'col%' 
     for xml path('')), 1, 1, '') 

set @query = 'SELECT QualityControlNumber, replace(col, ''col'', '''') as col, value 
      from test 
      unpivot 
      (
       value 
       for col in (' + @cols + ') 
      ) p ' 

execute(@query) 

SQL Fiddle with Demo

使用動態SQL這將讓你想什麼時候轉的字段列表該查詢被執行。這也可以防止你必須手動編碼192個單獨的列。