2016-12-29 1 views
-8

次のような表があります。私が生成している一意のID、他のテーブル(ArgumentIDsとeventID)、分類タイプ(eQualType)、そしてeventIDとeQualTypeに関連付けられた値を参照する2つのIDがあります。SQL Serverは新しいテーブルに行を転記します

Value1に何かしかない大部分の行が実際には20個の異なる値列(この例では短縮されています)があります。他の列は16〜20列の数値を持ちます(特定のイベントに関連付けられたすべての行とeQualType 1-5には、同じ数の列が入力されます)。個別の表に以下のようなものに

私はピボットするには、以下の表を取得しようとしています...

UniqueID ArgumentIDs eventID eQualType Value1 Value2 Value3 Value4 
1    7  1   4  1  2  3  4 
2    10  1   7  23   
3    11  1   2  1  2  2  3 
4    15  1   3  1  33  2  31 
5    8  1   6  8   
6    3  1   1  105 106 107 108 
7    9  1   5  0  0  0  0 
8    12  2   4  1  2  3  4 
9    16  2   1  91  92  93  94 
10    19  2   2  1  2  2  3 
11    17  2   5  0  0  0  0 
12    4  2   3  12  3  2  4 

は(理想的には、すでにこの形式でデータが含まれているテーブルに挿入されます)。 ArgumentIDは、別の表の中で何も参照しないため、プレースホルダまたは空白でなければならず、eQualTypeは以前のものと一致しない新しい値でなければなりません。

UniqueID ArgumentIDs eventID eQualType Value1 Value2 Value3 Value4 Value5 
1   x   1  999  105  1  1  1  0 
2   x   1  999  106  2  33  2  0 
3   x   1  999  107  2  2  3  0 
4   x   1  999  108  3  31  4  0 
5   8   1  6  8 

これが可能かどうか、またはSQLにロードする前に変換として行う方が良いかどうかはわかりません。

+0

「ピボットテーブルを取得する」という正確な意味はありますか?どのようにして、基本表に含まれる値から結果の 'Value'列を計算しますか?値列を集計し、結果表に新しい列として追加します。 –

+0

結果表のValue1列は、基本表の行6、Value2は行3などです。 – Drizzit12

+0

基本的には、結果テーブルの列に転記され、イベントIDによってまとめられます – Drizzit12

答えて

-7

私はそれを理解しました。コードについては以下を参照してください。

INSERT INTO Results (eventID,Result1,Result2,Result3,Result4,Result5) 
SELECT eventID, [1] as Result1, [2] as Result2, [3] as Result3, [4] as Result4, [5] as Result5 
FROM 
(SELECT [inputTable].eventID,[inputTable].eQualType,[inputTable].Value1 
FROM eventQData 
WHERE eQualType IN (1, 2, 3, 4, 5) AND (Value2 > 0) 
) AS inputTable 
PIVOT 
(MAX(Value1) 
FOR [eQualType] IN ([1],[2],[3],[4],[5]) 
+9

質問には不完全なサンプル入出力データがあるので、実際にこれをテストできる人は1人しかいないため、OPは自分の答えを受け入れることを理解できます。しかしなぜアップヴォート?これは質問に答えません。それは無言のルールを適用します。それは構文的に間違っています。そして、エラーを修正した後でさえ、それは指定された所望の出力を生成する近くには至らない。 –

+6

賞金の支払いが終わる前に公開賞金を得て自分の質問に答えると、質問のすべての部分に答えることなく、実際に少し不信に思えます。私はCraigの答えは疑問視されたところでは近いと思っており、それを受け入れることによって(特にあなたが非自明な答えを見つけるのに費やした時間を見れば)、そのように評価されるべきだと思います。 –

14

あなたが列Value1, Value2, Value3, Value4を取ると行にそれらをトランスポーズ:

 
Value1 
Value2 
Value3 
Value4 

は(ピボットない)INGのUNPIVOTあなたが実際にやっていると呼ばれています。これはあなたの質問の周りにいくつかの混乱を作成しました。しかし、これはかなり簡単な解決策を見つけるのに役立ちます。

以下のクエリは、PIVOTクエリでサブクエリとして使用されるUNPIVOTを実行します。各Result値の元のValue列を簡単に追跡できることがわかりました。最終結果でeQualTypeから100を引いてこれを記録することができます。私の答えはまた、Result6列を最終出力に含めることの効果を示しています。

 
eventID  eQualType Result1  Result2  Result3  Result4  Result5  Result6 
----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- 
1   101   105   1   1   1   0   8 
1   102   106   2   33   2   0   NULL 
1   103   107   2   2   3   0   NULL 
1   104   108   3   31   4   0   NULL 
2   101   91   1   12   1   0   NULL 
2   102   92   2   3   2   0   NULL 
2   103   93   2   2   3   0   NULL 
2   104   94   3   4   4   0   NULL 

(8 row(s) affected) 

注こと:ここで(。必要でない場合はもちろん、それは除外することができる)

SELECT eventID, 100 + ValueCol as eQualType, 
     [1] as Result1, [2] as Result2, [3] as Result3, [4] as Result4, [5] as Result5, [6] as Result6 
FROM (
     SELECT eventId, eQualType, CAST(RIGHT(ValueCol, 1) as int) as ValueCol, val 
     FROM ( SELECT eventId, eQualType, Value1, Value2, Value3, Value4 
       FROM @t1) src 
     UNPIVOT (val FOR ValueCol IN (Value1, Value2, Value3, Value4) 
       ) AS unpvt 
    )as inp 
PIVOT (MAX(val) FOR eQualType in ([1],[2],[3],[4],[5],[6])) pvt 
ORDER BY 1,2 

はあなたのサンプルの入力データを使用した結果が(一意IDとArgumentIDは、あなたの質問内の情報に基づいて除外)されています私の結果は、含まれている無意味な行とは別に、サンプル出力のほとんどに一致します。もちろん、eventID=2の結果とResult6の結果が含まれています。

関連する問題