2013-05-28 33 views
1

我在一个表中包含同一CardNum的多行数据的数据。我想创建一个表,其中同一行CardNum的所有数据都显示在同一行上。SQL 2008将具有相同ID的多个行的数据合并到一行中

我的数据是目前这样的:

PartID | CardNumber | RdrGrpID | TZID 

0   412   31   1 
0   412   34   1 
0   567   38   1 
0   567   33   5 
0   567   71   3 

这是我想的数据是:

PartID | CardNumber | RdrGrpID_1 | TZID_1 | RdrGrpID_2 | TZID_2 | RdrGrpID_3 | TZID_3 

0   412   31   1  34   1 
0   567   38   1  33   5  71   3 

预先感谢您。

回答

3

为了得到这个结果,有几种方法可以制定查询。

如果您有值的每个partIdcardNumber数量有限,那么你可以使用row_number()与聚合函数/ CASE组合:

select partid, cardnumber, 
    max(case when rn = 1 then rdrgrpid end) rdrgrpid_1, 
    max(case when rn = 1 then TZID end) TZID_1, 
    max(case when rn = 2 then rdrgrpid end) rdrgrpid_2, 
    max(case when rn = 2 then TZID end) TZID_2, 
    max(case when rn = 3 then rdrgrpid end) rdrgrpid_3, 
    max(case when rn = 3 then TZID end) TZID_3 
from 
(
    select partId, cardNumber, RdrGrpID, TZID 
     , row_number() over(partition by partiD, cardnumber 
          order by rdrgrpid) rn 
    from yt 
) d 
group by partid, cardnumber; 

SQL Fiddle with Demo

您还可以使用PIVOT/UNPIVOT函数得到结果:

select * 
from 
(
    select partid, cardnumber, 
    col+'_'+cast(rn as varchar(10)) col, 
    val 
    from 
    (
    select partId, cardNumber, RdrGrpID, TZID 
     , row_number() over(partition by partiD, cardnumber 
          order by rdrgrpid) rn 
    from yt 
) d 
    unpivot 
    (
    val 
    for col in (rdrgrpid, tzid) 
) un 
) s 
pivot 
(
    max(val) 
    for col in (RdrGrpID_1, TZID_1, RdrGrpID_2, TZID_2, 
       RdrGrpID_3, TZID_3) 
) piv 

请参阅SQL Fiddle with Demo

现在,如果你有一个未知的数值,那么你就需要使用动态SQL:

DECLARE @colsPivot AS NVARCHAR(MAX), 
    @query AS NVARCHAR(MAX) 

select @colsPivot = STUFF((SELECT ',' + QUOTENAME(c.col + '_'+cast(rn as varchar(10))) 
        from 
        (
         select row_number() over(partition by partiD, cardnumber 
                    order by rdrgrpid) rn 
         from yt 
        ) t 
        cross apply 
        (
         select 'RdrGrpID' col, 1 so union all 
         select 'TZID', 2 
        ) c 
        group by col, rn, so 
        order by rn, so 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 


set @query 
    = 'select partid, cardnumber, '[email protected]+' 
     from 
     (
     select partid, cardnumber, 
      col+''_''+cast(rn as varchar(10)) col, 
      val 
     from 
     (
      select partId, cardNumber, RdrGrpID, TZID 
      , row_number() over(partition by partiD, cardnumber 
           order by rdrgrpid) rn 
      from yt 
     ) d 
     unpivot 
     (
      val 
      for col in (rdrgrpid, tzid) 
     ) un 
    ) s 
     pivot 
     (
     max(val) 
     for col in ('+ @colspivot +') 
    ) p' 

exec(@query); 

SQL Fiddle with Demo。所有版本给出结果:

| PARTID | CARDNUMBER | RDRGRPID_1 | TZID_1 | RDRGRPID_2 | TZID_2 | RDRGRPID_3 | TZID_3 | 
----------------------------------------------------------------------------------------- 
|  0 |  412 |   31 |  1 |   34 |  1 |  (null) | (null) | 
|  0 |  567 |   33 |  5 |   38 |  1 |   71 |  3 | 
+0

bluefeet,工作就像魅力。非常感谢大家。 – mariofer

0

我会使用PIVOT。这是第一个Id的例子。我会对第二个Id做同样的事情,然后加入表格。

SELECT PartID, CardNumber, [1], [2],[3] 
FROM 
(SELECT PartID, CardNumber, RdrGrpID, 
     rank() over (partition by CardNumber order by RdrGrpID) r 
FROM [dbo].[Table_1]) AS SourceTable 
PIVOT 
(
MIN([RdrGrpID]) 
FOR r IN ([1], [2],[3]) 
) AS PivotTable; 
相关问题