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

Откуда: Königsberg in Preußen
Сообщений: 79
Есть таблица вида:
+Исходная таблица
SELECT 'Z11' AS Num1, '10' AS N_1, '3,72' AS P_1, '1439.87' AS Num2, '10' AS N_2, '3,67' AS P_2, '0212-02-0209.87P' AS Num3, '10' AS N_3, '2,58' AS P_3 union all
select 'Z11', '10', '3,72', '1439.87', '10', '3,67', '1335.87', '10', '4,09' union all
select 'Z11', '10', '3,72', 'WA4255.87D', '4', '4,1', '0212-02-0209.87P', '10', '2,58' union all
select 'Z11', '10', '3,72', 'WA4255.87D', '4', '4,1', '1335.87', '10', '4,09' union all
select 'Z 18', '10', '1,04', 'Z 95', '10', '1,21', 'EYQ C 72 LJS', '10', '0,83' union all
select 'Z 18', '10', '1,04', 'Z 95', '10', '1,21', 'Z 56', '10', '1,01' union all
select 'Z 18', '10', '1,04', 'Z 95', '10', '1,21', '0 241 240 610', '1', '1,19' union all
select 'Z 18', '10', '1,04', 'Z 95', '10', '1,21', 'DNST20EPR-U', '10', '1,22' union all
select 'Z 18', '10', '1,04', 'Z 95', '10', '1,21', 'Z 26', '10', '1,24' union all
select 'Z 18', '10', '1,04', 'Z 95', '10', '1,21', 'Z 55', '10', '1,34' union all
select 'Z 18', '10', '1,04', 'Z 95', '10', '1,21', 'DNSD7', '10', '1,38' union all
select 'Z 18', '10', '1,04', 'Z 95', '10', '1,21', 'V-LINE NR7', '10', '1,54' union all
select 'Z 18', '10', '1,04', 'Z 95', '10', '1,21', '0 242 240 591', '10', '1,56' union all
select 'Z 18', '10', '1,04', 'Z 95', '10', '1,21', 'TR5-1 1', '10', '1,81' union all
select 'Z 18', '10', '1,04', 'Z 95', '10', '1,21', '0 242 225 571', '4', '1,84' union all
select 'Z 18', '10', '1,04', 'Z 95', '10', '1,21', 'TR5-1 2', '8', '1,88' union all
select 'Z 18', '10', '1,04', 'Z 95', '10', '1,21', '0 242 232 507', '10', '2,61' union all
select 'Z 18', '10', '1,04', 'Z 95', '10', '1,21', 'UXT 4', '10', '2,81' union all
select 'Z 18', '10', '1,04', 'Z 95', '10', '1,21', '0 242 235 908', '4', '5,54' union all
select 'Z 18', '10', '1,04', 'Z 95', '10', '1,21', '0 242 235 607', '10', '5,57' union all
select 'Z 18', '10', '1,04', 'Z 95', '10', '1,21', 'DNSIT20', '10', '7,55' union all
select 'Z 18', '10', '1,04', 'BPR6EFS', '10', '1,54', 'EYQ C 72 LJS', '10', '0,83' union all
select 'Z 18', '10', '1,04', 'BPR6EFS', '10', '1,54', 'Z 56', '10', '1,01' union all
select 'Z 18', '10', '1,04', 'BPR6EFS', '10', '1,54', '0 241 240 610', '1', '1,19' union all
select 'Z 18', '10', '1,04', 'BPR6EFS', '10', '1,54', 'DNST20EPR-U', '10', '1,22' union all
select 'Z 18', '10', '1,04', 'BPR6EFS', '10', '1,54', 'Z 26', '10', '1,24' union all
select 'Z 18', '10', '1,04', 'BPR6EFS', '10', '1,54', 'Z 55', '10', '1,34' union all
select 'Z 18', '10', '1,04', 'BPR6EFS', '10', '1,54', 'DNSD7', '10', '1,38' union all
select 'Z 18', '10', '1,04', 'BPR6EFS', '10', '1,54', 'V-LINE NR7', '10', '1,54' union all
select 'Z 18', '10', '1,04', 'BPR6EFS', '10', '1,54', '0 242 240 591', '10', '1,56' union all
select 'Z 18', '10', '1,04', 'BPR6EFS', '10', '1,54', 'TR5-1 1', '10', '1,81' union all
select 'Z 18', '10', '1,04', 'BPR6EFS', '10', '1,54', '0 242 225 571', '4', '1,84' union all
select 'Z 18', '10', '1,04', 'BPR6EFS', '10', '1,54', 'TR5-1 2', '8', '1,88' union all
select 'Z 18', '10', '1,04', 'BPR6EFS', '10', '1,54', '0 242 232 507', '10', '2,61' union all
select 'Z 18', '10', '1,04', 'BPR6EFS', '10', '1,54', 'UXT 4', '10', '2,81' union all
select 'Z 18', '10', '1,04', 'BPR6EFS', '10', '1,54', '0 242 235 908', '4', '5,54' union all
select 'Z 18', '10', '1,04', 'BPR6EFS', '10', '1,54', '0 242 235 607', '10', '5,57' union all
select 'Z 18', '10', '1,04', 'BPR6EFS', '10', '1,54', 'DNSIT20', '10', '7,55'


Как привести её к виду:
+Итог
SELECT 'Z11' AS Num1, '10' AS N_1, '3,72' AS P_1, '1439.87' AS Num2, '10' AS N_2, '3,67' AS P_2, '0212-02-0209.87P' AS Num3, '10' AS N_3, '2,58' AS P_3 union all
select '', '', '', 'WA4255.87D', '4', '4,1', '1335.87', '10', '4,09' union all
select '', '', '', '', '', '', '', '', '' union all
select 'Z 18', '10', '1,04', 'BPR6EFS', '10', '1,54', '0 241 240 610', '1', '1,19' union all
select '', '', '', 'Z 95', '10', '1,21', '0 242 225 571', '4', '1,84' union all
select '', '', '', '', '', '', '0 242 232 507', '10', '2,61' union all
select '', '', '', '', '', '', '0 242 235 607', '10', '5,57' union all
select '', '', '', '', '', '', '0 242 235 908', '4', '5,54' union all
select '', '', '', '', '', '', '0 242 240 591', '10', '1,56' union all
select '', '', '', '', '', '', 'DNSD7', '10', '1,38' union all
select '', '', '', '', '', '', 'DNSIT20', '10', '7,55' union all
select '', '', '', '', '', '', 'DNST20EPR-U', '10', '1,22' union all
select '', '', '', '', '', '', 'EYQ C 72 LJS', '10', '0,83' union all
select '', '', '', '', '', '', 'TR5-1 1', '10', '1,81' union all
select '', '', '', '', '', '', 'TR5-1 2', '8', '1,88' union all
select '', '', '', '', '', '', 'UXT 4', '10', '2,81' union all
select '', '', '', '', '', '', 'V-LINE NR7', '10', '1,54' union all
select '', '', '', '', '', '', 'Z 26', '10', '1,24' union all
select '', '', '', '', '', '', 'Z 55', '10', '1,34' union all
select '', '', '', '', '', '', 'Z 56', '10', '1,01'


Собственно логика в следующем: Нужно пройтись по блоку Num1, и заменить все повторы пустыми ячейками. Затем пройтись по блоку Num2, и заменить все повторы в рамках Блока Num1 на пустые ячейки с сортировкой внутри блока. Затем пройтись по блоку Num3, и заменить все повторы в рамках Блока Num1 на пустые ячейки с сортировкой внутри блока.
26 июн 12, 17:39    [12778393]     Ответить | Цитировать Сообщить модератору
 Re: Свернуть итог запроса до удобочитаемого вида  [new]
Shakill
Member

Откуда: мск
Сообщений: 1882
Super_DJ, вы не указали порядок сортировки для вашего "пройтись по блоку"
26 июн 12, 18:12    [12778689]     Ответить | Цитировать Сообщить модератору
 Re: Свернуть итог запроса до удобочитаемого вида  [new]
Super_DJ
Member

Откуда: Königsberg in Preußen
Сообщений: 79
Shakill,

Не совсем понял, но...
Сначала все строки сортируются по Num1, потом в рамках блока с одинаковым Num1 поочередно сортируются и чистятся блоки Num2 и Num3. блоки Num2 и Num3 в рамках блока Num1 не зависят друг от друга.
26 июн 12, 18:53    [12778832]     Ответить | Цитировать Сообщить модератору
 Re: Свернуть итог запроса до удобочитаемого вида  [new]
Shakill
Member

Откуда: мск
Сообщений: 1882
Super_DJ,

если есть две строки с одинаковым num1 и num2, какая из них будет считаться повтором, а какая "первой"?
26 июн 12, 19:02    [12778862]     Ответить | Цитировать Сообщить модератору
 Re: Свернуть итог запроса до удобочитаемого вида  [new]
Super_DJ
Member

Откуда: Königsberg in Preußen
Сообщений: 79
Shakill,

DISTINCT с сортировкой внутри каждого блока, наверное так понятнее будет.
26 июн 12, 19:06    [12778870]     Ответить | Цитировать Сообщить модератору
 Re: Свернуть итог запроса до удобочитаемого вида  [new]
Добрый Э - Эх
Guest
select 

case row_number() over(partition by num1 order by num1, num2, num3) when 1 then num1 end as num1,
case row_number() over(partition by num1 order by num1, num2, num3) when 1 then N_1 end as N_1,
case row_number() over(partition by num1 order by num1, num2, num3) when 1 then P_1 end as P_1,

case row_number() over(partition by num1, num2 order by num1, num2, num3) when 1 then num2 end as num2,
case row_number() over(partition by num1, num2 order by num1, num2, num3) when 1 then N_2 end as N_2,
case row_number() over(partition by num1, num2 order by num1, num2, num3) when 1 then P_2 end as P_2,

case row_number() over(partition by num1, num2, num3 order by num1, num2, num3) when 1 then num3 end as num3,
case row_number() over(partition by num1, num2, num3 order by num1, num2, num3) when 1 then N_3 end as N_3,
case row_number() over(partition by num1, num2, num3 order by num1, num2, num3) when 1 then P_3 end as P_3

from [есть таблица] t
order by t.num1, t.num2, t.num3
26 июн 12, 20:42    [12779130]     Ответить | Цитировать Сообщить модератору
 Re: Свернуть итог запроса до удобочитаемого вида  [new]
Super_DJ
Member

Откуда: Königsberg in Preußen
Сообщений: 79
Добрый Э - Эх,

Блок Num1 очистился от повторов
Блок Num2 очистился от повторов но остался не сортированным
Блок Num3 содержит повторы, с ним похоже вообще ничего не произошло
26 июн 12, 20:55    [12779169]     Ответить | Цитировать Сообщить модератору
 Re: Свернуть итог запроса до удобочитаемого вида  [new]
sskk
Guest
бред какой-то.
блоки N2 И N3 не связаны между собой.
тем не менее находятся в одной таблице

-- #t - Исходная таблица

declare @N1 table  (num1 varchar(50), N_1 varchar(50),P_1 varchar(50))
declare @N2 table  (num1 varchar(50), num2 varchar(50), N_2 varchar(50),P_2 varchar(50))
declare @N3 table  (num1 varchar(50), num3 varchar(50), N_3 varchar(50),P_3 varchar(50))
 
 
insert into @n1
select distinct num1 ,n_1,p_1 from #t


insert into @n2
select distinct num1, num2 ,n_2,p_2 from #t

insert into @n3
select distinct num1,num3 ,n_3,p_3 from #t
 
 ;with n3 as(
select num1 n1_fk,
case when r_n1=1 then num1 else '' end num1,
case when r_n3=1 then num3 else '' end num3,
case when r_n3=1 then n_3 else '' end n_3,
case when r_n3=1 then p_3 else '' end p_3,
row_number()over(partition by num1 order by (select 1))rrn1


from(
select *,
row_number()over(partition by num1 order by (select 1))r_n1,
row_number()over(partition by num1,num3 order by (select 1))r_n3
from @n3 n3
)Z )
,
n2 as(
select num1 n1_fk,
case when r_n1=1 then num1 else '' end num1,
case when r_n2=1 then num2 else '' end num2,
case when r_n2=1 then n_2 else '' end n_2,
case when r_n2=1 then p_2 else '' end p_2,
row_number()over(partition by num1 order by (select 1))rrn1

from(
select *,
row_number()over(partition by num1 order by (select 1))r_n1,
row_number()over(partition by num1,num2 order by (select 1))r_n2
from @n2 n2
)Z )


select
coalesce(n2.num1,'') num1,
coalesce(num2,'') num2,
coalesce(n_2,'') n_2,
coalesce(p_2,'')p_2,
coalesce(num3,'')num3,
coalesce(n_3,'')n_3,
coalesce(p_3,'')p_3
from n2 full join n3 on n2.n1_fk=n3.n1_fk and n2.rrn1=n3.rrn1
27 июн 12, 11:29    [12781098]     Ответить | Цитировать Сообщить модератору
 Re: Свернуть итог запроса до удобочитаемого вида  [new]
Super_DJ
Member

Откуда: Königsberg in Preußen
Сообщений: 79
sskk,

Это не бред. Тем не менее почти конфетка. Поля n_1 и p_1 потерялись, но думаю это проблемой не станет.

Премного благодарен за помощь.
27 июн 12, 15:42    [12783519]     Ответить | Цитировать Сообщить модератору
 Re: Свернуть итог запроса до удобочитаемого вида  [new]
sskk
Guest
Это не бред. Тем не менее почти конфетка. Поля n_1 и p_1 потерялись


точно, забыл поля добавить, ну ничего, разберетесь, я думаю.
28 июн 12, 00:44    [12785999]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить