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

Это одно решение. Это грубая сила и использует объединение всех, чтобы принести получить несколько копий:

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 

В том числе ООПТ требует добавления другого КТР, а затем присоединение сделок и ООПТ на dealid и ПА идентификатору, чтобы получить все возможные комбинации. Вы не указали точно, что хотите, когда в обеих строках есть дубликаты, поэтому я просто предполагаю, что вам нужны все комбинации.

+0

Я получаю сообщение об ошибке Msg 189, Level 15, State 1, Line 16 Функция charindex требует от 2 до 3 аргументов. –

+0

Я оставил аргумент из charindex. Я только что исправил это. –

+0

Итак, выполним ваш запрос. unfortuantley это не работает. Это дает мне новую сделку, в которой есть 2 значения для идентификатора сделки. В основном вы используете 5 столбцов для таблицы. Подумайте, что он не разбивает его на отдельные строки на основе идентификатора Deal или идентификатора PA. Спасибо за попытку, так как это сложная проблема. –

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