2015-06-11 3 views
0

меня таблице ниженужно разделить значение столбца

id name total 
1 a   2 
2 b   3 
3 c,d,e,f 15 

Ожидаемый выход: -

id name total 
1 a  2 
2 b  3 
3 c  15 
4 d  15 
5 e  15 
5 f  15 

Я попытался раздвоение функцию, а также XML, но не работает.

+2

Что РСУБД вы используете? – Ram

+2

Каков был код, который вы пробовали? – kojow7

+2

Почему идентификатор застрял на '5' ?, что произойдет, если была строка с идентификатором' 4'? – Lamak

ответ

0

Какую версию SQL вы используете?

Функция разделения предназначена для разделения строки текста, но то, что вы запрашиваете, является изменением формата самой таблицы.

В таблице есть кортеж id = 3, name = c, d, e, f, total = 15.

Если вы хотите id = 3, name = c и т. Д., Вы должны изменить данные.

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

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

Как только у вас есть этот список элементов, если ваше поле идентификатора является полем идентификатора (автоинкремент), вы можете запустить инструкцию insert для каждого элемента.

Возможно, вы сможете получить нужный результат, используя внутренний выбор, который разбивает список значений, разделенных запятыми, но вам понадобится некоторый процедурный SQL (или T-SQL ... вы не укажите свой SQL-сервер), чтобы перебирать значения и вставлять их в новую таблицу. Если вы идете по этому маршруту, значения идентификатора должны быть выброшены, и вы будете рассматривать список как просто необработанный набор данных.

РЕДАКТИРОВАТЬ: Пример, представленный «Не имеет отображаемого имени» примерно так же близко, как вы собираетесь получить с данными в том виде, в котором он находится. Идентификаторы имен «c», «d», «e» и «f» будут равны 3, но ваш формат будет очень близок.

1

Как вы не укажете имя базы данных, предположив SQL SERVER. Вы можете попробовать это.

Working Example

SELECT A.[id], 
    Split.a.value('.', 'VARCHAR(100)') AS String,A.total 
FROM (SELECT [id], 
       CAST ('<M>' + REPLACE([name], ',', '</M><M>') + '</M>' AS XML) AS String , 
       [total] 
     FROM #t) AS A 
CROSS APPLY String.nodes ('/M') AS Split(a); 

см это article

+0

Работаю как шарм. Большое спасибо ! – SQLBlog

+0

По какой-то причине я НЕ могу отметить этот ответ как хороший. – SQLBlog

+0

Есть несколько способов сделать то же самое, вы должны сначала показать нам, что вы пробовали, и что вам нужно. Существует несколько вариантов ответа в Интернете, вам нужно просто выполнить поиск, которого вы не делаете. В вопросе вы не говорите, что вам нужен ответ определенным образом – HaveNoDisplayName

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