2016-12-29 101 views
-8

我有一張如下所示的表。有一個我正在生成的唯一ID,另外兩個ID引用其他表(ArgumentIDs和eventID),一個分類類型(eQualType),然後是與eventID和eQualType關聯的值。SQL Server將行轉換爲新表

實際上有20個不同的值列(縮寫爲本示例),絕大多數行只有Value1中的某些值。其他人將在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

你是什麼意思的「讓桌子轉動」?如何計算基表中包含的值的結果中的「值」列?它看起來像聚合值列並將它們作爲新列添加到結果表中...... –

+0

結果表中的Value1列是基表中的第6行,Value2是第3行等 – Drizzit12

+0

基本上,基表中的行正在轉換爲結果表中的列,並由eventID – 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

我可以理解OP接受他/她自己的答案,因爲只有一個人可以在問題中給出不完整的樣本輸入/輸出數據的情況下對此進行實際測試。但爲什麼upvote?這並沒有回答這個問題。它適用未規定的規則。它在語法上不正確。而且即使在修正了錯誤之後,它也遠沒有達到所要求的輸出。 –

+6

那麼,在賞金的死亡之路結束之前,回答自己的問題以及開放的賞金,而不回答問題的所有部分似乎確實有點惡意。我認爲克雷格的回答在接受質疑時應該更加接近,並且應該因此而受到尊重(特別是如果你看看他花費在尋找非平凡答案上的時間)。 –

14

當你把列Value1, Value2, Value3, Value4,並將其轉成行:

 
Value1 
Value2 
Value3 
Value4 

你實際上做的是叫做UNPIVOT荷蘭國際集團(不旋轉)。這對你的問題造成了一些困惑。但注意到這有助於找到一個相當直接的解決方案。 (當然你的結果是你確實想把你的中間結果轉化爲你的最終解決方案,所以仍然適用。)

下面的查詢執行一個UNPIVOT,它用作PIVOT查詢中的一個子查詢。我發現很容易跟蹤每個結果值來自的原始值列;您可以在最終結果中通過從eQualType中減去100來注意到這一點。我的回答也顯示了在最終輸出中包含Result6列的效果。 (當然可以,如果沒有必要被排除在外。)

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 

以下是使用樣本輸入數據的結果(的UniqueID和ArgumentID基於信息在你的問題除外):

 
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) 

注意除了您包含的無意義的第5行外,我的結果與您的大部分示例輸出相匹配。當然,我已經包含eventID=2Result6的結果。