Инкрементная конкатенация столбцов на строку в SQL - PullRequest
0 голосов
/ 16 апреля 2019

Я пытаюсь написать сценарий Oracle или MS SQL, который выводит первую строку, содержащую значение ячейки в столбце A, вторая строка содержит значение ячейки столбца A, объединенную со столбцом B и разделенную запятой, третья строка содержитзначения ячеек столбцов A, B и C объединяются и разделяются запятой.

Предположим, что следующая таблица SQL:

|columnA |columnB|columnC |columnD |columnF |columnG |  
|--------|-------|--------|--------|--------|--------|
|  matty | lucy  |  james | mike   | tala   | mark   | 
|  jana  | steph |  alex  | mohd   | hani   | elie   |

Вывод будет:

matty 
matty,lucy
matty,lucy,james
matty,lucy,james,mike 
matty,lucy,james,mike,tala
matty,lucy,james,mike,tala,mark
jana
jana,steph
jana,steph,alex
jana,steph,alex,mohd
jana,steph,alex,mohd,hani
jana,steph,alex,mohd,hani,elie

Как мне написать оператор выбора SQL?

Ответы [ 3 ]

2 голосов
/ 16 апреля 2019

Вы можете использовать apply:

select tt.*
from table t cross apply
     ( values (columnA, null, null, null, null, null),
              (columnA, columnB, null, null, null, null),
               . . . 
              (columnA, columnB, columnC, columnD, columnF, columnG)    
     ) tt(col1, col2, col3, col4, col5, col6);

Если вы хотите объединить все данные в один столбец, используйте concat():

select tt.*
from table t cross apply
     ( values (columnA),
              (concat(columnA, ',', columnB)),
              (concat(columnA, ',', columnB, ',', columnC)),
              (concat(columnA, ',', columnB, ',', columnC, ',', columnD)),
              (concat(columnA, ',', columnB, ',', columnC, ',', columnD, ',', columnF)),
              (concat(columnA, ',', columnB, ',', columnC, ',', columnD, ',', columnF, ',', columnG))
     ) tt(cols);
1 голос
/ 16 апреля 2019

Если вы хотите версию, которая работает в обеих базах данных:

select colA
from t
union all
select concat(Col1, concat(',', colB))
from t
union all
select concat(concat(Col1, concat(',', colB)), concat(',', colC))
from t
union all
. . .
1 голос
/ 16 апреля 2019

Один из способов - отсоединить данные и выполнить рекурсивное объединение (решение Oracle):

--data 
with t(a, b, c, d, e, f) as (
    select 'matty', 'lucy',  'james', 'mike', 'tala', 'mark' from dual union all 
    select 'jana ', 'steph', 'alex',  'mohd', 'hani', 'elie' from dual )
-- end of data
select ltrim(sys_connect_by_path(name, ','), ',') path
  from (select rownum r1, a, b, c, d, e, f from t) 
        unpivot (name for r2 in (a as 1, b as 2, c as 3, d as 4, e as 5, f as 6))
  connect by prior r1 = r1 and r2 = prior r2 + 1
  start with r2 = 1

demo

...