将SQL列转换为具有ID的行

时间:2012-08-07 20:11:24

标签: sql sql-server database while-loop

我的数据是192个单独的列。它们是列对,因此存在15分钟时间片和质量控制号的数据。它的设置方式现在每行代表一天。我想将数据插入到具有较少列的另一个表中(Date,ReadTime,QualityControlNumber,Reading,...) 我开始尝试像这样的while循环,但似乎不可能使用变量来更改列标题。

我应该嵌套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#'+@count], [Interval# +@count] ,[Conversion Factor] 
        from table 
        where [Number] = '103850581' 
            and [Start Date] = '060112' 

        set @count = (@count+1) 
    END 

3 个答案:

答案 0 :(得分: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个单独的列。

答案 1 :(得分:0)

虽然你的问题并不完全清楚,但听起来你需要某种类似于UNPIVOT的操作形式。这使您可以将列旋转为行。我建议阅读它,看看它是否适合你 - 即使它没有,它可能会建议一种方法可行。

答案 2 :(得分:0)

您想要的命令是unpivot。类似的东西:

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

你会发现你不会真正得到日期,而是原来的列名。您可以通过将unpivot查询放在子查询(或CTE)中,然后使用字符串操作和强制转换将列名转换为日期来解决此问题。