powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Запрос-> Собрать наименования подзадач
9 сообщений из 9, страница 1 из 1
Запрос-> Собрать наименования подзадач
    #38654852
Lexx_SQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день!
Имеется таблица Test с полями ID (номер задачи),Task (наименование задачи)

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
CREATE TABLE dbo.TEST([ID] INTEGER, [Task] NVARCHAR(100))
GO
INSERT dbo.TEST VALUES('1', N'Задача 1')
INSERT dbo.TEST VALUES('1.1', N'Подзадача 1')
INSERT dbo.TEST VALUES('2', N'Задача 2')
INSERT dbo.TEST VALUES('2.1', N'Подзадача 1')
INSERT dbo.TEST VALUES('2.2', N'Подзадача 2')
INSERT dbo.TEST VALUES('2.2.1', N'Подзадача 1')
GO


Необходимо написать запрос с выводом данных ID, строка с именами задач верхнего уровня через разделитель '->'+Task:
'1','Задача 1',''
'1.1','Задача 1->Подзадача 1'
'2','Задача 2',''
'2.1','Задача 2->Подзадача 1'
'2.2','Задача 2->Подзадача 2'
'2.2.1','Задача 2->Подзадача 2->Подзадача 1' и т.д.
Вложенность неопределенна.
Подскажите как сделать.....
Спасибо.
...
Рейтинг: 0 / 0
Запрос-> Собрать наименования подзадач
    #38654866
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А как вы умудрились в INTEGER занести значения 1.1 и 2.2.1 ?
...
Рейтинг: 0 / 0
Запрос-> Собрать наименования подзадач
    #38654869
Фотография Shakill
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lexx_SQL, почему у вас id типа integer, когда заполняете строкой?

а по вашему вопросу - берете эту строку, которую пытаетесь запихнуть в поле id, и при помощи replace заменяете каждую точку на слово " -> подзадача "
...
Рейтинг: 0 / 0
Запрос-> Собрать наименования подзадач
    #38655328
Lexx_SQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shakill,
ID -NVARCHAR...

"берете эту строку, которую пытаетесь запихнуть в поле id, и при помощи replace заменяете каждую точку на слово " -> подзадача " "
'Задача' , 'Подзадача'- это условное наименование, и его значение мы можем взять по номеру ID уровня выше.
Есть примеры по составлению строки:
Код: sql
1.
2.
3.
4.
select [ID],
  [Name] = replace((select [Name] as 'data()' from TEST where [Тип] = t.[Тип] for xml path('')), ' ', '->')
from dbo.TEST t
group by [ID]


Но запрос собирает данные только по совпадающим ID, а у меня иерархия.
...
Рейтинг: 0 / 0
Запрос-> Собрать наименования подзадач
    #38655330
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lexx_SQL,

рекурсивное CTE
...
Рейтинг: 0 / 0
Запрос-> Собрать наименования подзадач
    #38655346
Фотография китайский сервер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lexx_SQL,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
;with 
a as (select ID, cast([Task] as nvarchar(max)) as [Task], len([ID])-len(replace(ID,'.',''))+1 as [level] from dbo.TEST),
b as (
	select ID, [Task], [level] from a where [level]=1

	union all

	select a.ID, b.[Task]+'->'+a.[Task], a.[level] from a inner join b on a.[level]-1=b.[level] and a.ID like b.ID+'.%'
)

select * from b
...
Рейтинг: 0 / 0
Запрос-> Собрать наименования подзадач
    #38655381
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
select *, replace((select [Task] as 'data()' from @TEST b where a.[ID] LIKE b.[ID]+'%' for xml path('')), ' ', '->')
from @TEST a
...
Рейтинг: 0 / 0
Запрос-> Собрать наименования подзадач
    #38655392
Lexx_SQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Glory,

Спасибо огромное. То что надо!!!
...
Рейтинг: 0 / 0
Запрос-> Собрать наименования подзадач
    #38655431
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
select *, replace((select [Task] as 'data()' from @TEST b where a.[ID] LIKE b.[ID]+'.%' for xml path('')), ' ', '->')
from @TEST a


Так правильнее. Ибо нумерация может быть и многозначной
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Запрос-> Собрать наименования подзадач
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]