0

1 つの値のみを含む 2 列のテーブルがありますが、一部のエントリには 2 つまたは 3 つの値が含まれています。これらの問題行のその他の列はすべて同じです。

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、削除します。

4

2 に答える 2

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 
于 2012-05-25T10:13:36.463 に答える
0

これが1つの解決策です。これはブルート フォースであり、ユニオン オールを使用して複数のコピーを取得します。

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

PA を含めるには、別の CTE を追加し、dealid と PA id で取引と PA を結合して、すべての可能な組み合わせを取得する必要があります。両方の行に重複がある場合に何が起こるかを正確に指定していないので、すべての組み合わせが必要になると推測しています。

于 2012-05-24T15:45:18.600 に答える