2012-05-24 72 views
0

我有一个2列应该只包含一个值,但一些条目包含2或3值的表。所有其他列对于这些问题行都是相同的。Unpivot或别的东西

Table A - Currently 
Deal ID | PA ID | other columns 
1   2  xxxxx 
1,2  2  xxxxx 
3   1,5  xxxxx 

我想

Deal ID | PA ID | other columns 
1   2  xxxxx 
1   2  xxxxx 
2   2  xxxxx 
3   1  xxxxx 
3   5  xxxxx 

不知道如何做到这一点呢?认为我需要UNPIVOT,然后删除,。

+0

我的DB2的版本没有'UNPIVOT',所以我会写一个递归查询(不能现在)拆分此。但是那种布局......请转动,折叠和破坏原始设计师。 –

回答

0

这是一个解决方案。这是蛮力,并使用UNION ALL把获得多个副本:

with incols as (
    select (case when charindex(Dealid, ',') > 0 
        then left(DealId, charindex(Dealid, ',') - 1) 
        else DealId 
      end) as DealId1, 
      (case when charindex(Dealid, ',') > 0 
        then substring(DealId, charindex(DealId, ',') + 1, 100) 
      end) as DealId2, 
      (case when charindex(PAId, ',') > 0 
        then left(PAId, charindex(PAId, ',') - 1) 
        else PAId 
      end) as PAId1, 
      (case when charindex(PAId, ',') > 0 
        then substring(PAId, charindex(PAId, ',') + 1, 100) 
      end) as PAId2, 
      t.* 
    from t 
    ), 
    deals as (
    select (case when whichdeal = 1 then deal1 else deal2 end) as newdeal, t.* 
    from ((select *, 1 as whichdeal 
      from t 
      ) union all 
      (select *, 2 as whichdeal 
      from t 
      where deal2 is not null 
      )) t 
    ) 
select newdeal as dealid, t.* 
from deals 

包括功率放大器需要添加另一个CTE,然后在dealid和PA ID加入交易和PAS得到所有可能的组合。当两行都有重复时,你没有具体说明你想要发生什么,所以我只是猜测你会想要所有的组合。

+0

我收到一条错误消息189,级别15,状态1,行16 charindex函数需要2到3个参数。 –

+0

我离开了charindex的论点。我只是修复它。 –

+0

好的,最后执行你的查询。不幸的是它不起作用。它给了我一个新交易coulm,其中有交易id的2个值。基本上你在桌子上只有5列。认为它不是根据交易ID或PA ID将其分成单独的行。无论如何,感谢您的尝试,因为这是一个难题。 –

0

的解决方案是:

DECLARE @t TABLE ( 
    DealID VARCHAR(10), 
    PAID VARCHAR(200), 
    [DESC] VARCHAR(100)) 

INSERT @t 
SELECT '1', 
     '2', 
     'xxxx' 
UNION ALL 
SELECT '1,2', 
     '2', 
     'xxxx' 
UNION ALL 
SELECT '3', 
     '1,5', 
     'xxxx' 

SELECT LEFT(b, Charindex(',', b + ',') - 1) AS DealID, 
     LEFT(d, Charindex(',', d + ',') - 1) AS PAID, 
     [Desc] 
FROM (SELECT Substring(DealID, DE.number, 200) AS b, 
       Substring(PAID, PA.number, 200) AS d, 
       [Desc] 
     FROM @t DealID 
       LEFT JOIN (SELECT DISTINCT number 
          FROM master.dbo.spt_values 
          WHERE number BETWEEN 1 AND 200) PA 
       ON Substring(',' + PAID, PA.number, 1) = ',' 
       LEFT JOIN (SELECT DISTINCT number 
          FROM master.dbo.spt_values S 
          WHERE number BETWEEN 1 AND 200) DE 
       ON Substring(',' + DealID, DE.number, 1) = ',') t