1

我有 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 
4

3 回答 3

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

为此使用动态 SQL 将获得执行查询时要转置的字段列表。这也避免了您必须为 192 个单独的列手动编码。

于 2012-08-07T20:21:38.330 回答
0

尽管您的问题并不完全清楚,但听起来您需要某种类似于UNPIVOT. 这使您可以将列旋转为行。我建议阅读它,看看它是否对你有用——即使它没有,它可能会建议一种可行的方法。

于 2012-08-07T20:19:30.017 回答
0

您想要的命令是 unpivot。就像是:

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

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

于 2012-08-07T20:19:42.347 回答