1

192 列のデータがあります。これらは列のペアであるため、15 分のタイム スライスと品質管理番号のデータがあります。現在の設定方法では、各行が 1 日を表します。列の少ない別のテーブルにデータを挿入したい (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ループを使用する必要はありません。192個の個別の列を行に変換しようとしているUNPIVOT場合は、必ず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 FiddlewithDemoを参照してください

これに動的SQLを使用すると、クエリの実行時に転置するフィールドのリストが取得されます。これにより、192個の個別の列を手動でコーディングする必要もなくなります。

于 2012-08-07T20:21:38.330 に答える
0

質問は完全には明確ではありませんが、に似た何らかの操作が必要なようですUNPIVOT。これにより、列を行に回転させることができます。私はそれを読んで、それがあなたのために働くかどうか見ることを提案します-たとえそれがうまくいかなくても、それはうまくいくアプローチを示唆するかもしれません。

于 2012-08-07T20:19:30.017 に答える
0

必要なコマンドはピボット解除です。何かのようなもの:

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

実際には日付を取得するのではなく、元の列名を取得することがわかります。これを修正するには、ピボット解除クエリをサブクエリ(またはCTE)に配置し、文字列操作とキャストを使用して列名を日付に変換します。

于 2012-08-07T20:19:42.347 に答える