如果之前已经提出这个问题,我会事先道歉。
我有两张桌子。表一有三列CustomerID, SequenceNum, Value
,表二有大量列。我想用表格逐行填写表格2的列,而不是按行填写。
一个例子:
------------------------------------
| CustomerID | SequenceNum | Value |
------------------------------------
| 1 | 1 | A |
------------------------------------
| 1 | 2 | B |
------------------------------------
| 1 | 3 | C |
------------------------------------
| 2 | 1 | Q |
------------------------------------
| 2 | 2 | R |
------------------------------------
| 3 | 1 | X |
------------------------------------
变为
---------------------------------------------------------------------
| CustomerID | PrimaryVal | OtherVal1 | OtherVal2 | OtherVal3 | ... |
---------------------------------------------------------------------
| 1 | A | B | C | NULL | ... |
---------------------------------------------------------------------
| 2 | Q | R | NULL | NULL | ... |
----------------------------------------------------------------------
| 3 | X | NULL | NULL | NULL | ... |
---------------------------------------------------------------------
实质上。表1中的每个唯一CustomerID
在表2中都有一行。特定SequenceNum
的每个CustomerID
都会在PrimaryVal, OtherVal1, OtherVal2, etc.
下的表二中填入一列。 SequenceNum
等于1的行将填充PrimaryVal
字段,2-18(最大序列长度为18)将填充OtherVal#
。
我看到的主要问题是序列中可变数量的值。有些序列可能只包含1行,有些会填满所有18个点,以及其间的任何内容。
如何解决这个问题的任何建议将不胜感激。谢谢。
答案 0 :(得分:2)
鉴于你知道它最多是18列,我会采用正常的枢轴路径。
select customerID, Pivoted.*
from Customer
pivot( Value for sequencenum in (1,2,3,4,5,6, upto 18)) as Pivoted
我在这里很懒,而且没有别名列,但如果你需要,你可以。
答案 1 :(得分:1)
这可以通过Dynamic Pivot完成。第一个STUFF
选择(或任何其他GROUP_CONCAT
hack)用于确定所需的列(基于SequenceNum
的值),然后将其应用到动态数据透视表中,然后将值分配给这些专栏。
您需要在轮播期间(我已使用Min
)对汇总发表意见,但如果没有重复CustomerId, SequenceNum
个元组,是一个相当随意的选择:
DECLARE
@cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX);
SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(SequenceNum)
FROM Table1
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'');
set @query = N'SELECT CustomerID, ' + @cols + N' from
Table1
pivot
(
min(Value)
for SequenceNum in (' + @cols + N')
) p ';
execute(@query);