2012-05-24 69 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