arvindcis Ответов: 2

Преобразование в csv из столбца SQL


I have a table [Charts] contains value in column [name] like FLOWERS, ANIMALS,GAMES and their name table looking like this
<pre>Id					Name			ParentId
1					FLOWERS			0
2					rose			1
3					lily			1
4					lotus			1
5					ANIMALS			0
6					dog				5
7					cat				5
8					rat				5
9					monkey			5
10					GAMES			0
11					cricket			10
12					football		10
13					basketball		10
14					badminton		10



Мне нужен такой вывод
Name		Id
Flowers		2,3,4
Animals		6,7,8,9
Games		11,12,13,14


Что я уже пробовал:

Нужно ли мне создавать какую-либо функцию sql

2 Ответов

Рейтинг:
15

MadMyche

То, что вы хотите сделать, это прочитать дальше Сцепление
Конкатенация значений строк в Transact-SQL - Simple Talk[^]

Этот пример похож на трюки XML, извините, что я не слишком много играл с ним, чтобы разработать INT vs VARCHAR

declare @table table (
  ID  varchar(16)
, ParentID  varchar(16)
, [Name] varchar(16)
)

insert @table
values (1, 0, 'FLOWERS'), (2, 1, 'rose'), (3, 1, 'lily')
, (4, 1, 'lotus'), (5, 0, 'ANIMALS'), (6, 5, 'dog'), (7, 5, 'cat')
, (8, 5, 'rat'), (9, 5, 'monkey'), (10, 0, 'GAMES'), (11, 10, 'cricket')
, (12, 10, 'football'), (13, 10, 'basketball'), (14, 10, 'badminton')

SELECT p.[Name]
,      Children = SUBSTRING( (
         SELECT ','+c.ID  AS [text()]
         FROM @table c
         WHERE c.ParentID = p.ID
         ORDER BY c.ID
         FOR XML PATH ('')
        ), 2, 1000)
FROM     @table p
WHERE    p.ParentID = 0
order by p.ID
Но это дает желаемые результаты
Name      Children
--------  ---------
FLOWERS   2,3,4
GAMES     11,12,13,14
ANIMALS   6,7,8,9


Richard Deeming

Единственный CAST вызов требуется, чтобы заставить его работать с int столбцы:

SELECT ',' + CAST(c.ID As varchar(max))  AS [text()]

:)

Рейтинг:
0

Dominic Burford

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