Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Последовательность данных в строку  [new]
pooleet
Member

Откуда:
Сообщений: 45
Здравствуйте, подскажите как можно решить такую задачку :

Есть таблица
a1 a2 a3
1 00163303
2 00163303 00163299
3 00163299 00162586
4 00162586 00162587
5 00162587 00119944
6 00119944 00104638
7 00104638 00109075
8 00109075 00065036
2 00163303 00162835
3 00162835 00084388


как можно получить такую таблицу? (число столбцов всегда 8)
abcdefgh
00163303 00163299 00162586 00162587 00119944 00104638 00109075 00065036
00163303 00162835 00084388nullnullnullnullnull
8 окт 12, 16:05    [13285553]     Ответить | Цитировать Сообщить модератору
 Re: Последовательность данных в строку  [new]
pooleet
Member

Откуда:
Сообщений: 45
CREATE TABLE #tmp
(
a1 varchar(10), a2 varchar(10), a3 varchar(10) 
)
INSERT INTO #tmp (a1,a2,a3) values ('1','','00163303')
INSERT INTO #tmp (a1,a2,a3) values ('2','00163303','00163299')
INSERT INTO #tmp (a1,a2,a3) values ('3','00163299','00162586')
INSERT INTO #tmp (a1,a2,a3) values ('4','00162586','00162587')
INSERT INTO #tmp (a1,a2,a3) values ('5','00162587','00119944')
INSERT INTO #tmp (a1,a2,a3) values ('6','00119944','00104638')
INSERT INTO #tmp (a1,a2,a3) values ('7','00104638','00109075')
INSERT INTO #tmp (a1,a2,a3) values ('8','00109075','00065036')
INSERT INTO #tmp (a1,a2,a3) values ('2','00163303','00162835')
INSERT INTO #tmp (a1,a2,a3) values ('3','00162835','00162835')
8 окт 12, 16:06    [13285565]     Ответить | Цитировать Сообщить модератору
 Re: Последовательность данных в строку  [new]
pooleet
Member

Откуда:
Сообщений: 45
Ну или подскажите хотя бы какой нибудь алгоритм решения
9 окт 12, 08:48    [13288171]     Ответить | Цитировать Сообщить модератору
 Re: Последовательность данных в строку  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Задача не определена (смысла нет).
10 окт 12, 13:48    [13295754]     Ответить | Цитировать Сообщить модератору
 Re: Последовательность данных в строку  [new]
pooleet
Member

Откуда:
Сообщений: 45
Mnior,
необходимо построить полностью путь от первого числа 00163303 до 00065036 или до 00084388
потом по этой цепочке я буду группировать и сортировать данные
10 окт 12, 14:07    [13295943]     Ответить | Цитировать Сообщить модератору
 Re: Последовательность данных в строку  [new]
pooleet
Member

Откуда:
Сообщений: 45
привязанные к этой цепочке
10 окт 12, 14:07    [13295949]     Ответить | Цитировать Сообщить модератору
 Re: Последовательность данных в строку  [new]
pooleet
Member

Откуда:
Сообщений: 45
Пробовала перебирать через case перезаписывала в новую таблицу, потом перебирала заново, до тех пор пока не заполняться все 8 столбцов, но почему то мне кажется что возможно решить эту задачу другим методом
10 окт 12, 14:11    [13295993]     Ответить | Цитировать Сообщить модератору
 Re: Последовательность данных в строку  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
pooleet
все 8 столбцов
Структура таблица не соответсвует задаче совершенно.
Т.е. бесмысленные действия. Если путь жёсткий по глубине и не ветвится на каждом шагу, то вааще лол.

Какие нафиг варианты, он один.
DECLARE	@Table TABLE (
	 ID	Int IDENTITY PRIMARY KEY
	,Step	VarChar(10) NOT NULL
	,[From]	VarChar(10)	NULL
	,[To]	VarChar(10) NOT NULL
	,UNIQUE (Step,[From],[To])
)INSERT	@Table (Step,[From],[To]) VALUES
 ('1',      NULL,'00163303')
,('2','00163303','00163299')
,('3','00163299','00162586')
,('4','00162586','00162587')
,('5','00162587','00119944')
,('6','00119944','00104638')
,('7','00104638','00109075')
,('8','00109075','00065036')
,('2','00163303','00162835')
,('3','00162835','00162835')

SELECT	 S1.[To] AS [a]
	,S2.[To] AS [b]
	,S3.[To] AS [c]
	,S4.[To] AS [d]
	,S5.[To] AS [e]
	,S6.[To] AS [f]
	,S7.[To] AS [g]
	,S8.[To] AS [h]
FROM	          @Table	S1
	LEFT JOIN @Table	S2 ON S2.Step = 2 AND S2.[From] = S1.[To]
	LEFT JOIN @Table	S3 ON S3.Step = 3 AND S3.[From] = S2.[To]
	LEFT JOIN @Table	S4 ON S4.Step = 4 AND S4.[From] = S3.[To]
	LEFT JOIN @Table	S5 ON S5.Step = 5 AND S5.[From] = S4.[To]
	LEFT JOIN @Table	S6 ON S6.Step = 6 AND S6.[From] = S5.[To]
	LEFT JOIN @Table	S7 ON S7.Step = 7 AND S7.[From] = S6.[To]
	LEFT JOIN @Table	S8 ON S8.Step = 8 AND S8.[From] = S7.[To]
WHERE	S1.Step = 1
ORDER BY S1.ID,S2.ID,S3.ID,S4.ID,S5.ID,S6.ID,S7.ID,S8.ID
10 окт 12, 17:01    [13297669]     Ответить | Цитировать Сообщить модератору
 Re: Последовательность данных в строку  [new]
pooleet
Member

Откуда:
Сообщений: 45
думала получится без уточнения уровня, попробовала не получилось

надо было так делать

iabcdefgh
100163303nullnullnullnullnullnullnull
20016330300163299nullnullnullnullnullnull
20016330300162835nullnullnullnullnullnull
3001633030016329900162586nullnullnullnullnull
3001633030016283500084388nullnullnullnullnull
400163303001632990016258600162587nullnullnullnull
50016330300163299001625860016258700119944nullnullnull
6001633030016329900162586001625870011994400104638nullnull
700163303001632990016258600162587001199440010463800109075null
800163303 00163299 00162586 00162587 00119944 00104638 00109075 00065036
11 окт 12, 10:27    [13300736]     Ответить | Цитировать Сообщить модератору
 Re: Последовательность данных в строку  [new]
f070214
Member

Откуда:
Сообщений: 35
ну вот такой запрос возвратит нужные данные, хотя полностью согласен с Mnior - практического смысла в такой выборке пока не вижу и структура таблицы явно не подходит сформулированной задаче

with cteData as
  ( select	t1.a3 as [1]
		  , t2.a3 as [2]
		  , t3.a3 as [3]
		  , t4.a3 as [4]
		  , t5.a3 as [5]
		  , t6.a3 as [6]
		  , t7.a3 as [7]
		  , t8.a3 as [8]
	from	#tmp t1
		left outer join #tmp t2 on t2.a1 = 2 and t2.a2 = t1.a3
		left outer join #tmp t3 on t3.a1 = 3 and t3.a2 = t2.a3
		left outer join #tmp t4 on t4.a1 = 4 and t4.a2 = t3.a3
		left outer join #tmp t5 on t5.a1 = 5 and t5.a2 = t4.a3
		left outer join #tmp t6 on t6.a1 = 6 and t6.a2 = t5.a3
		left outer join #tmp t7 on t7.a1 = 7 and t7.a2 = t6.a3
		left outer join #tmp t8 on t8.a1 = 8 and t8.a2 = t7.a3
	where	t1.a1 = 1 )
select	distinct
		1 as [0]
	  , [1] as [1]
	  , null as [2]
	  , null as [3]
	  , null as [4]
	  , null as [5]
	  , null as [6]
	  , null as [7]
	  , null as [8]
from	cteData
where	not [1] is null
union all
select	distinct 2, [1], [2], null, null, null, null, null, null
from	cteData
where	not [2] is null
union all
select	distinct 3, [1], [2], [3], null, null, null, null, null
from	cteData
where	not [3] is null
union all
select	distinct 4, [1], [2], [3], [4], null, null, null, null
from	cteData
where	not [4] is null
union all
select	distinct 5, [1], [2], [3], [4], [5], null, null, null
from	cteData
where	not [5] is null
union all
select	distinct 6, [1], [2], [3], [4], [5], [6], null, null
from	cteData
where	not [6] is null
union all
select	distinct 7, [1], [2], [3], [4], [5], [6], [7], null
from	cteData
where	not [7] is null
union all
select	distinct 8, [1], [2], [3], [4], [5], [6], [7], [8]
from	cteData
where	not [8] is null;
11 окт 12, 12:47    [13301762]     Ответить | Цитировать Сообщить модератору
 Re: Последовательность данных в строку  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Включите моск.
DECLARE	@Table TABLE (
	 ID	Int IDENTITY PRIMARY KEY
	,Step	VarChar(10) NOT NULL
	,[From]	VarChar(10)	NULL
	,[To]	VarChar(10) NOT NULL
	,UNIQUE (Step,[From],[To])
)INSERT	@Table (Step,[From],[To]) VALUES
 ('1',      NULL,'00163303')
,('2','00163303','00163299')
,('3','00163299','00162586')
,('4','00162586','00162587')
,('5','00162587','00119944')
,('6','00119944','00104638')
,('7','00104638','00109075')
,('8','00109075','00065036')
,('2','00163303','00162835')
,('3','00162835','00162835')
;------------------------------------------------------------------------
WITH Data AS (
	SELECT ID  ,Step,[From],[To]	FROM @Table
UNION ALL
	SELECT NULL,NULL,NULL  ,NULL
)
SELECT	 S1.[To] AS [a]
	,S2.[To] AS [b]
	,S3.[To] AS [c]
	,S4.[To] AS [d]
	,S5.[To] AS [e]
	,S6.[To] AS [f]
	,S7.[To] AS [g]
	,S8.[To] AS [h]
FROM	          Data	S1
	LEFT JOIN Data	S2 ON S2.Step = 2 AND S2.[From] = S1.[To] OR S2.ID IS NULL
	LEFT JOIN Data	S3 ON S3.Step = 3 AND S3.[From] = S2.[To] OR S3.ID IS NULL
	LEFT JOIN Data	S4 ON S4.Step = 4 AND S4.[From] = S3.[To] OR S4.ID IS NULL
	LEFT JOIN Data	S5 ON S5.Step = 5 AND S5.[From] = S4.[To] OR S5.ID IS NULL
	LEFT JOIN Data	S6 ON S6.Step = 6 AND S6.[From] = S5.[To] OR S6.ID IS NULL
	LEFT JOIN Data	S7 ON S7.Step = 7 AND S7.[From] = S6.[To] OR S7.ID IS NULL
	LEFT JOIN Data	S8 ON S8.Step = 8 AND S8.[From] = S7.[To] OR S8.ID IS NULL
WHERE	S1.Step = 1
ORDER BY S1.ID,S2.ID,S3.ID,S4.ID,S5.ID,S6.ID,S7.ID,S8.ID
Изучайте синтаксис и семантику
DECLARE	@Table TABLE (
	 ID	Int IDENTITY PRIMARY KEY
	,Step	VarChar(10) NOT NULL
	,[From]	VarChar(10)	NULL
	,[To]	VarChar(10) NOT NULL
	,UNIQUE (Step,[From],[To])
)INSERT	@Table (Step,[From],[To]) VALUES
 ('1',      NULL,'00163303')
,('2','00163303','00163299')
,('3','00163299','00162586')
,('4','00162586','00162587')
,('5','00162587','00119944')
,('6','00119944','00104638')
,('7','00104638','00109075')
,('8','00109075','00065036')
,('2','00163303','00162835')
,('3','00162835','00162835')
;------------------------------------------------------------------------
SELECT	X.*
FROM	          @Table	S1
	LEFT JOIN @Table	S2 ON S2.Step = 2 AND S2.[From] = S1.[To]
	LEFT JOIN @Table	S3 ON S3.Step = 3 AND S3.[From] = S2.[To]
	LEFT JOIN @Table	S4 ON S4.Step = 4 AND S4.[From] = S3.[To]
	LEFT JOIN @Table	S5 ON S5.Step = 5 AND S5.[From] = S4.[To]
	LEFT JOIN @Table	S6 ON S6.Step = 6 AND S6.[From] = S5.[To]
	LEFT JOIN @Table	S7 ON S7.Step = 7 AND S7.[From] = S6.[To]
	LEFT JOIN @Table	S8 ON S8.Step = 8 AND S8.[From] = S7.[To]
	CROSS APPLY (
		SELECT	 S1.[To],NULL   ,NULL   ,NULL   ,NULL   ,NULL   ,NULL   ,NULL
	UNION	SELECT	 S1.[To],S2.[To],NULL   ,NULL   ,NULL   ,NULL   ,NULL   ,NULL
	UNION	SELECT	 S1.[To],S2.[To],S3.[To],NULL   ,NULL   ,NULL   ,NULL   ,NULL
	UNION	SELECT	 S1.[To],S2.[To],S3.[To],S4.[To],NULL   ,NULL   ,NULL   ,NULL
	UNION	SELECT	 S1.[To],S2.[To],S3.[To],S4.[To],S5.[To],NULL   ,NULL   ,NULL
	UNION	SELECT	 S1.[To],S2.[To],S3.[To],S4.[To],S5.[To],S6.[To],NULL   ,NULL
	UNION	SELECT	 S1.[To],S2.[To],S3.[To],S4.[To],S5.[To],S6.[To],S7.[To],NULL
	UNION	SELECT	 S1.[To],S2.[To],S3.[To],S4.[To],S5.[To],S6.[To],S7.[To],S8.[To]
	) X ([a],[b],[c],[d],[e],[f],[g],[h])
WHERE	S1.Step = 1
ORDER BY S1.ID,S2.ID,S3.ID,S4.ID,S5.ID,S6.ID,S7.ID,S8.ID
DISTINCT + UNION ALL это чистый UNION
Это для показа, естественно что этот вариант (DISTINCT/UNION) полная глупость. За решения "в лоб" надо бить в лоб.
11 окт 12, 15:21    [13303144]     Ответить | Цитировать Сообщить модератору
 Re: Последовательность данных в строку  [new]
tetxx
Member

Откуда:
Сообщений: 297
Еще вариант
with t as (
  select t2.a3, 0 as lvl, row_number()over(order by t2.a3) as idx
  from #tmp t2
  where exists (select 1 from #tmp t where t.a3 = t2.a2 and t.a2 = '')
  union all
  select t2.a3, lvl+1, idx
  from t
  inner join #tmp t2 on t.a3 = t2.a2
  where t2.a2<>t2.a3 and lvl<=7
)
,tt as (
  select [0],[1],[2],[3],[4],[5],[6]
  from t
  pivot(max(a3)for lvl in ([0],[1],[2],[3],[4],[5],[6])) pvt
)
select t2.a2, tt.*
from #tmp t2
left join tt on t2.a3=tt.[0]
where exists (select 1 from #tmp t where t.a3 = t2.a2 and t.a2 = '')
11 окт 12, 17:47    [13304222]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить