SQL разбивает 2 поля на строки - PullRequest
0 голосов
/ 14 февраля 2019

У меня есть строка данных, которая выглядит следующим образом:

200,500,1000 | 50,100,200 | TUA03 | 2019-02-21

Из следующего запроса.

select distinct 
    tbl.qualifier_value,
    tbl.h_discount_val,
    tbl.longlist_mm_text,
    tbl.p_start_date 
from @HoldingTable tbl

Мне нужно разбить первые два поля на новые соответствующие строки.Чтобы получить следующий вывод:

200 | 50 | TUA03 | 2019-02-21
500 | 100 | TUA03 | 2019-02-21
1000 | 200 | TUA03 | 2019-02-21

Я могу получить первое разделение поля следующим образом:

select distinct 
    s.Item,
    tbl.h_discount_val,
    tbl.longlist_mm_text,
    tbl.p_start_date
from @HoldingTable tbl
outer apply [dbo].[Split](qualifier_value, ',') s

, который дает:

1000 |  50,100,200 | TUA03 | 2019-02-21
200  |  50,100,200 | TUA03 | 2019-02-21
500  |  50,100,200 | TUA03 | 2019-02-21

Теперь мне нужнотакже разделите второе поле, но аккуратно свяжите позицию с правильной позицией из первого столбца.Внешне применяя ту же идею ко второму полю, я получаю 9 строк назад, но не могу сопоставить, какое значение второго поля совпадает с позицией значения первого поля.

Это достижимо?

1 Ответ

0 голосов
/ 14 февраля 2019

Одним из методов является рекурсивный CTE.Мне немного непонятно, как называются имена столбцов, поэтому я сделал их общими:

with cte as (
      select left(col1, charindex(',', col1) - 1) as col1,
             left(col2, charindex(',', col2) - 1) as col2,
             col3, col4,
             stuff(col1, 1, charindex(',', col1), '') as col1_rest,
             stuff(col2, 1, charindex(',', col2), '') as col2_rest
      from t
      union all
      select left(col1_rest, charindex(',', col1_rest + ',') - 1) as col1,
             left(col2_rest, charindex(',', col2_rest + ',') - 1) as col2,
             col3, col4,
             stuff(col1_rest, 1, charindex(',', col1_rest + ','), '') as col1_rest,
             stuff(col2_rest, 1, charindex(',', col2_rest + ','), '') as col2_rest
      from cte
      where col1_rest > ''
     )
select col1, col2, col3, col4
from cte;

Здесь - это скрипта db <>.

...