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

Откуда:
Сообщений: 1526
Надо преобразовать исходную табличку (на скрине слева) в ту, что справа.
Тоесть в столбце ParentKey отобразить Ключ Родителя...
Помогите? С UNPIVOT'ом пока не до конца разобрался...

К сообщению приложен файл. Размер - 44Kb
25 мар 13, 10:08    [14090791]     Ответить | Цитировать Сообщить модератору
 Re: Хэлп с запросом (UnPivot я так понимаю...)  [new]
Santa89
Member

Откуда:
Сообщений: 1526
Я пробую так:
SELECT
DISTINCT [Уровень1] as Имя
UNION
SELECT
DISTINCT [Уровень2] as Имя
UNION ...

Только надо это обьединение как-то пронумеровать...помогите ёмаё!?
25 мар 13, 11:32    [14091208]     Ответить | Цитировать Сообщить модератору
 Re: Хэлп с запросом (UnPivot я так понимаю...)  [new]
Glory
Member

Откуда:
Сообщений: 104751
ROW_NUMBER()
25 мар 13, 11:48    [14091304]     Ответить | Цитировать Сообщить модератору
 Re: Хэлп с запросом (UnPivot я так понимаю...)  [new]
zozozozozo
Guest
Santa89,

Привет. Попробуй, вроде оно

WITH TMP
AS
(
	SELECT CAST(N'маша' AS NVARCHAR(20)) AS [Имя], CAST(N'россия' AS NVARCHAR(20)) AS [Уровень1], CAST(N'урал' AS NVARCHAR(20)) AS [Уровень2], CAST(N'томская' AS NVARCHAR(20)) AS [Уровень3], CAST(N'томск' AS NVARCHAR(20))  AS [Уровень4]
		UNION ALL
	SELECT CAST(N'даша' AS NVARCHAR(20)) AS [Имя], CAST(N'америка' AS NVARCHAR(20)) AS [Уровень1], CAST(N'флорида' AS NVARCHAR(20)) AS [Уровень2], CAST(N'майами' AS NVARCHAR(20)) AS [Уровень3], CAST(NULL AS NVARCHAR(20))  AS [Уровень4]
		UNION ALL
	SELECT CAST(N'саша' AS NVARCHAR(20)) AS [Имя], CAST(N'россия' AS NVARCHAR(20)) AS [Уровень1], CAST(N'урал' AS NVARCHAR(20)) AS [Уровень2], CAST(NULL AS NVARCHAR(20)) AS [Уровень3], CAST(NULL AS NVARCHAR(20))  AS [Уровень4]
),
TMP1
AS
(
	SELECT
		TMP.Имя,
		TMP.Уровень1,
		TMP.Уровень2,
		TMP.Уровень3,
		TMP.Уровень4,
		ROW_NUMBER() OVER(ORDER BY (SELECT 1)) AS GN	
	FROM
		TMP
),
TMP2
AS
(
	SELECT
		YYY.tmpnum,
		CASE YYY.tmpnum
			WHEN 1 THEN YYY.[Имя]
			WHEN 2 THEN YYY.[Уровень1]
			WHEN 3 THEN YYY.[Уровень2]
			WHEN 4 THEN YYY.[Уровень3]
			WHEN 5 THEN YYY.[Уровень4]
		END AS Name,
		CASE YYY.tmpnum
			WHEN 1 THEN
				CASE
					WHEN [Уровень4] IS NOT NULL THEN 5
					WHEN [Уровень3] IS NOT NULL THEN 4
					WHEN [Уровень2] IS NOT NULL THEN 3
					WHEN [Уровень1] IS NOT NULL THEN 2
				END
			WHEN 2 THEN NULL
			WHEN 3 THEN 2
			WHEN 4 THEN 3
			WHEN 5 THEN 4
		END AS tmpparentid,
		YYY.GN

	FROM
	(
		SELECT TMP1.*, M.*
		FROM
			TMP1
				CROSS JOIN
			(VALUES(1),(2),(3),(4),(5)) AS M(tmpnum)
	) AS YYY
),
TMP3
AS
(
	SELECT T.*, DENSE_RANK() OVER(ORDER BY tmpnum, name, tmpparentid) AS ID
	FROM
		TMP2 T
)
	SELECT DISTINCT
		T1.name,
		T1.id,
		(SELECT T2.ID
		 FROM
			TMP3 T2
		 WHERE T2.tmpnum = T1.tmpparentid
			AND T2.GN = T1.GN
		) AS parentid
	FROM
		TMP3 AS T1
	WHERE Name IS NOT NULL


name;id;parentid
америка;4;NULL
даша;1;9
майами;9;7
маша;2;12
россия;5;NULL
саша;3;6
томск;12;10
томская;10;6
урал;6;5
флорида;7;4
25 мар 13, 20:29    [14094161]     Ответить | Цитировать Сообщить модератору
 Re: Хэлп с запросом (UnPivot я так понимаю...)  [new]
zozozozozo
Guest
nameidparentid
америка4NULL
даша19
майами97
маша212
россия5NULL
саша36
томск1210
томская106
урал65
флорида74
25 мар 13, 20:31    [14094166]     Ответить | Цитировать Сообщить модератору
 Re: Хэлп с запросом (UnPivot я так понимаю...)  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
Или так:
;with myTable as (select * from (values
 (3,convert(varchar,'маша'),convert(varchar,'россия'),convert(varchar,'урал'),convert(varchar,'томская область'),convert(varchar,'томск'))
,(2,'даша','америка','флорида','майами',null)
,(1,'саша','россия','урал',null,null)
,(4,'паша','россия','московская область','москва',null)
)t(id,Имя,Уровень1,Уровень2,Уровень3,Уровень4))
,CTE as (
   select row_number() over (order by (select 1))rn,* 
   from (
      select distinct lvl, child, parent
      from myTable
      outer apply (
         select 1 lvl, null parent, Уровень1 child where Уровень1 is not null
         union all select 2, Уровень1, Уровень2 where Уровень2 is not null
         union all select 3, Уровень2, Уровень3 where Уровень3 is not null
         union all select 4, Уровень3, Уровень4 where Уровень4 is not null
         union all select 5, isnull(Уровень4,isnull(Уровень3,isnull(Уровень2,Уровень1))), Имя 
      ) c
   )d
)
select m.child, m.rn id, p.rn parentid
from CTE m
left join CTE p on p.child=m.parent
25 мар 13, 21:02    [14094245]     Ответить | Цитировать Сообщить модератору
 Re: Хэлп с запросом (UnPivot я так понимаю...)  [new]
Santa89
Member

Откуда:
Сообщений: 1526
Парни спасибо!
26 мар 13, 03:15    [14094936]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить