2013-08-22 3 views
0

Я создал запрос SQL Server, который расчленяет мои папки и трансформирует в строках (разграничены «\»)Transform строк в столбцах SQL

Например: Моя папка "N:\TESTEA\subTESTEB" первоначально. В моей новой таблице это значение: имя папки в строке.

N: 

TESTEA 

subTESTEB 

Но мне нужно преобразовать его в столбцы. Строка 1 в колонке 1; Строка 2 в колонке 2; и так далее.

Кто знает, что это такое? Одна проблема: эти папки имеют несколько уровней, а не стандартный уровень!

Я понятен?

Ниже мой SQL-запрос (я не знаю, форматировать этот SQL-код здесь!):

DECLARE @ARRAY VARCHAR(8000), @DELIMITADOR VARCHAR(100), @S VARCHAR(8000),@ARRAYFinal VARCHAR(8000) 
select sub_folder_path into #sub_folder_path from GROUP_FOLDER_ACCESS 
SELECT @DELIMITADOR = '\' 
CREATE TABLE ARRAY(ITEM_ARRAY VARCHAR(8000)) 

WHILE (select COUNT(*) from #sub_folder_path) > 0 
BEGIN 
SELECT @ARRAY = sub_folder_path from #sub_folder_path ORDER BY sub_folder_path 
SET @ARRAYFinal = @ARRAY 
SET @ARRAY = @ARRAY + @DELIMITADOR 
WHILE LEN(@ARRAY) > 0 
BEGIN 
    SELECT @S = LTRIM(SUBSTRING(@ARRAY, 1, CHARINDEX(@DELIMITADOR, @ARRAY) - 1)) 
    INSERT INTO ARRAY (ITEM_ARRAY) VALUES (@S) 
    SELECT @ARRAY = SUBSTRING(@ARRAY, CHARINDEX(@DELIMITADOR, @ARRAY) + 1, LEN(@ARRAY)) 
END 
DELETE #sub_folder_path WHERE sub_folder_path = @ARRAYFinal 
END 

ответ

0

У меня есть один вариант для этого. вы также используете поворот для динамического.

Вот пример, пожалуйста, бросьте его.

Dyanamic Pivot

также посмотреть в этом

Five methods converting rows to columns

Может быть, это поможет вам достичь вам задачу.

1

Если вы используете SQL 2005 или выше, вы можете использовать PIVOT keyword, но это как-то усложняют, взглянуть на this решение тоже. Я просто попробовал, и это работает, хотя я должен признать, что я не совсем понимаю все.

Предполагая, что у вас есть таблица под названием «Контуры» на колонку с «Путем», где ваши строки путей находятся в:

; with cte1 as (

    select 
    t2.Path, 
    t3.split, 
    ROW_NUMBER() over (partition by t2.Path order by t2.Path) as num 
    from 
    (
    select *, 
    CAST('<X>'+replace(t.Path,'\','</X><X>')+'</X>' as XML) as xmlfilter 
    from Paths t 
    ) t2 
    cross apply 
    (
    select col1data.D.value('.','varchar(50)') as split 
    from t2.xmlfilter.nodes('X') as col1data(D)) t3 
    ) 


    select Path, [1], [2], [3], [4], [5], [6], [7] 
from 
(
    select Path, num, split 
    from CTE1 
) as sourcetable 
pivot 
(max(split) for num IN ([1], [2], [3], [4], [5], [6], [7])) as pivottable 

Я признаю, что это не полностью динамическая версия. Если вы ищете такое решение, вам, вероятно, придется трепать некоторые UDF для разделения, а затем использовать курсоры и циклы, чтобы заполнить ваши данные в ранее подготовленной таблице.

Смежные вопросы