获取表的行作为第二个表中的列

时间:2015-07-09 14:48:50

标签: sql sql-server database sql-server-2012

如果之前已经提出这个问题,我会事先道歉。

我有两张桌子。表一有三列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个点,以及其间的任何内容。

如何解决这个问题的任何建议将不胜感激。谢谢。

2 个答案:

答案 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);

SqlFiddle here