ROW TO COLUMN - Сплит и прочее - PullRequest
       16

ROW TO COLUMN - Сплит и прочее

1 голос
/ 14 января 2020

У меня есть этот код

DECLARE @cols AS NVARCHAR(MAX), @vals AS NVARCHAR(MAX), @query AS NVARCHAR(MAX) 

SELECT @cols = STUFF(( SELECT ',' + x.Name
                    FROM (
                    SELECT Name FROM Persons)x
                    FOR xml PATH(''), TYPE
                    ).value('.','NVARCHAR(MAX)')
                    ,1,1,'') 

SELECT @vals = STUFF((SELECT ','+y.Column
                    FROM (
                    SELECT CONVERT (varchar, x.Subject) Column FROM subjects x) y
                    FOR XML PATH (''), TYPE).value('.','NVARCHAR(MAX)'),1,1,'')
SELECT @vals


SET @query = 'SELECT d.id, d.val Column, e.val Value 
              FROM (SELECT * FROM dbo.Split('''+@cols+''','','')) d, 
              (SELECT * FROM dbo.Split('''+@vals+''', '','')) e
              WHERE d.id = e.id'

, которые преобразуются в отдельную строку с запятыми (WITH STUFF), а затем передают ее в столбец (val), определенный функцией split. Преобразуйте все имена в строку, разделенную запятыми [Пако, Хуан, Пепе, Мария] и верните ее в столбец, НО я хочу, чтобы строка таблицы была разделена запятыми [Пако, Перес, Инглес] [Хуан, Эрнандес, Historia], чтобы потом передать его в колонку. Примерно так:

|ID |  Name | LastName |  Subject  |         |ID | Col   |   Col   |
| - | ----- | -------- | --------- |         | - | ----- | ------- |
| 1 |  Paco |   Perez  |  English  |  ------>| 1 |  Paco |   Juan  |
| 2 | Juan  | Hernandez|  History  |  ------>| 2 | Perez |Hernandez|
| 3 | Pepe  |   Salas  |   Spanish |         | 3 |English|vHistory | 
| 4 | MAria |   Cruz   |    Arts   | 
...