我的数据是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
答案 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将获得执行查询时要转置的字段列表。这也可以防止您必须手动编写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)中,然后使用字符串操作和强制转换将列名转换为日期来解决此问题。