powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / выстроить иерархию продуктов в строку
3 сообщений из 3, страница 1 из 1
выстроить иерархию продуктов в строку
    #40066651
minya13_85
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
SELECT @@VERSION

Microsoft SQL Server 2017 (RTM-CU23) (KB5000685) - 14.0.3381.3 (X64)   Feb  9 2021 12:08:50   
Copyright (C) 2017 Microsoft Corporation  Enterprise Edition (64-bit) on Windows Server 2016 Standard 10.0 <X64> (Build 14393: ) 



Есть таблица иерархии и справочник продуктов

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
DECLARE @hier TABLE (id INT,par_id INT,code NVARCHAR(10))
INSERT INTO @hier
(
    id,
    par_id,
    code
)

SELECT 1,11,'MAIN'
UNION
SELECT 11,21,'MAIN'
UNION
SELECT 21,31,'MAIN'
UNION
SELECT 31,41,'MAIN'
UNION
SELECT 41,NULL,'MAIN'
union
SELECT 2,22,'MAIN'
UNION
SELECT 22,32,'MAIN'
UNION
SELECT 32,NULL,'MAIN'
UNION
SELECT 5,15,'MAIN'
UNION
SELECT 15,31,'MAIN'

DECLARE @product TABLE(id INT,lname VARCHAR(50))
INSERT INTO @product
(
    id,
    lname
)

SELECT 1,'продукт1'
UNION
SELECT 11,'продукт11'
UNION
SELECT 21,'продукт21'
UNION
SELECT 31,'продукт31'
UNION
SELECT 41,'продукт41'
UNION
SELECT 2,'продукт2'
union
SELECT 22,'продукт22'
UNION
SELECT 32,'продукт32'
UNION
SELECT 5,'продукт5'
UNION
SELECT 15,'продукт15'



всего может быть максимум 5 уровней иерархии, нужно их выстроить в строку таким образом. Чтобы каждый продукт имел свою линейную иерархию.


id product_lev1_idproduct_lev1_nameproduct_lev2_idproduct_lev2_nameproduct_lev3_idproduct_lev3_nameproduct_lev4_idproduct_lev4_nameproduct_lev5_idproduct_lev5_name1 41 продукт41 31 продукт31 21 продукт21 11 продукт11 1 продукт12 32 продукт32 22 продукт22 2 продукт2 2 продукт2 2 продукт25 41 продукт41 31 продукт31 15 продукт15 5 продукт5 5 продукт511 41 продукт41 31 продукт31 21 продукт21 11 продукт1111 продукт1121 41 продукт41 31 продукт31 21 продукт2121 продукт2121 продукт2131 41 продукт41 31 продукт31 31 продукт3131 продукт3131 продукт314141 продукт4141 продукт4141 продукт4141 продукт4141 продукт412232 продукт32 22 продукт2222 продукт2222 продукт2222 продукт223232 продукт3232 продукт3232 продукт3232 продукт3232 продукт321541 продукт41 31 продукт31 15 продукт1515 продукт1515 продукт15

Написал запрос, помогите его докрутить:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
DECLARE @hier TABLE (id INT,par_id INT,code NVARCHAR(10))
INSERT INTO @hier
(
    id,
    par_id,
    code
)

SELECT 1,11,'MAIN'
UNION
SELECT 11,21,'MAIN'
UNION
SELECT 21,31,'MAIN'
UNION
SELECT 31,41,'MAIN'
UNION
SELECT 41,NULL,'MAIN'
union
SELECT 2,22,'MAIN'
UNION
SELECT 22,32,'MAIN'
UNION
SELECT 32,NULL,'MAIN'
UNION
SELECT 5,15,'MAIN'
UNION
SELECT 15,31,'MAIN'

DECLARE @product TABLE(id INT,lname VARCHAR(50))
INSERT INTO @product
(
    id,
    lname
)

SELECT 1,'продукт1'
UNION
SELECT 11,'продукт11'
UNION
SELECT 21,'продукт21'
UNION
SELECT 31,'продукт31'
UNION
SELECT 41,'продукт41'
UNION
SELECT 2,'продукт2'
union
SELECT 22,'продукт22'
UNION
SELECT 32,'продукт32'
UNION
SELECT 5,'продукт5'
UNION
SELECT 15,'продукт15'



;WITH hier AS 
(
SELECT h.id,h.par_id,p.lname,h.code
FROM @hier h
LEFT JOIN @product p ON p.id=h.id
WHERE h.code='MAIN'
)

SELECT COALESCE(e.id,d.id,c.id,b.id,a.id) id
,a.id product_lev1_id, a.lname  product_lev1_name
,COALESCE(b.id,a.id) product_lev2_id,COALESCE(b.lname,a.lname) product_lev2_name
,COALESCE(c.id,b.id,a.id) product_lev3_id,COALESCE(c.lname,b.lname,a.lname) product_lev3_name
,COALESCE(d.id,c.id,b.id,a.id) product_lev4_id,COALESCE(d.lname,c.lname,b.lname,a.lname) product_lev4_name
,COALESCE(e.id,d.id,c.id,b.id,a.id) product_lev5_id,COALESCE(e.lname,d.lname,c.lname,b.lname,a.lname) product_lev5_name
FROM hier a
LEFT JOIN hier b ON a.id=b.par_id
LEFT JOIN hier c ON b.id=c.par_id
LEFT JOIN hier d ON c.id=d.par_id
LEFT JOIN hier e ON d.id=e.par_id
WHERE a.par_id IS NULL

...
Рейтинг: 0 / 0
выстроить иерархию продуктов в строку
    #40066763
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Осподи, бред то какой.

1. Строите свою "иерархию" в "колоночку".
2. Колбасите PIVOT.
...
Рейтинг: 0 / 0
выстроить иерархию продуктов в строку
    #40066813
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleks222,

Вот здесь есть пример рекурсивного запроса с выстраиванием цепочки

https://www.sql.ru/forum/1322566/rekursiya-s-dublyami
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / выстроить иерархию продуктов в строку
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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