2016-12-29 105 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的结果。