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

Откуда:
Сообщений: 92
Помогите пожалуйста, есть запрос, который из таблицы вида:
p1,p2,p3,p4,p5,p6
p1,p2,p3,p4,p5,p6
p1,p2,p3,p4,p5,p6
выдает результат:
p1,p2,p3,p4,p5
p6
p1,p2,p3,p4,p5
p6
p1,p2,p3,p4,p5
p6
То есть последний столбец в строке переходит на новую строку. Но есть загвоздка:
"(values (0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) t1(i)
cross join (values (0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) t2(i)"Если например в таблице 1 000 000 записей, то если в value будет 10 нулей он выдаст где то 191 запись, если добавить нулей до 40 где то то выдаст 320 000 записей, если еще добавлять то он выдаст 1200 000 записей, то есть пойдет по второму кругу. Сам вопрос: как можно зациклить этот valuesб либо как то по другому сделать?



Запрос:

declare @t table (i int)
declare @p table (p1 char(2), p2 char(2), p3 char(2), p4 char(2), p5 char(2))

insert @t (i)
select
	row_number()over(order by (select 1)) - 1
from
	(values (0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) t1(i)
	cross join (values (0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) t2(i)

insert @p (p1, p2, p3, p4, p5)
values
	('A1', 'B1', 'C1', 'D1', 'E1'),
	('A2', 'B2', 'C2', 'D2', 'E2'),
	('A3', 'B3', 'C3', 'D3', 'E3')

;
with
t1 as
	(
	select
	p1, p2, p3, rn + i as n
	from
	(
	select
	p1, p2, p3, row_number()over(order by (select 1)) as rn
	from
	@p p
	)q
	inner join @t t on t.i = q.rn - 1
	),
t2 as
	(
	select
	p4 as p1, p5 as p2, null as p3, rn + i as n
	from
	(
	select
	p4, p5, row_number()over(order by (select 1)) as rn
	from
	@p p
	)q
	inner join @t t on t.i = q.rn
	)

select
	p1, p2, p3, n
from
	t1
union all
select
	p1, p2, p3, n
from
	t2
order by
	n


Сообщение было отредактировано: 15 апр 18, 19:15
15 апр 18, 19:02    [21340979]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на выборку  [new]
invm
Member

Откуда: Москва
Сообщений: 9351
select
 case when a.n = 1 then p.p1 else p.p4 end as p1,
 case when a.n = 1 then p.p2 else p.p5 end as p2,
 case when a.n = 1 then p.p3 end as p3,
 row_number() over (order by (select 1)) as n
from
 @p p cross apply
 (values (1), (2)) a(n);
15 апр 18, 19:41    [21341033]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на выборку  [new]
OlegEgorov11
Member

Откуда:
Сообщений: 92
invm, подскажите, мне нужно вставить это вместо двух строк, где у меня values((0), (0)....и т.д?
15 апр 18, 19:58    [21341055]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на выборку  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5111
OlegEgorov11
(values (0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) t1(i)
cross join (values (0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) t2(i)
это просто таблица с номерами от 0 до "сколько напишите", каждый cross join (с 10 нулями) это степень десятки 1- 10, 2 - 100, 3 - 1000 ...
если вам нужна такая таблица в базе не обязательно создавать её "онлайн" создайте её заранее.
впрочем, в данном случае она только для наглядности и не является обязательной см. 21341053
15 апр 18, 20:09    [21341067]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на выборку  [new]
invm
Member

Откуда: Москва
Сообщений: 9351
OlegEgorov11
invm, подскажите, мне нужно вставить это вместо двух строк, где у меня values((0), (0)....и т.д?
Такое впечатление, что вы даже не пробовали выполнить предложенный мной запрос.
15 апр 18, 20:26    [21341084]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на выборку  [new]
OlegEgorov11
Member

Откуда:
Сообщений: 92
invm, будет возможность только завтра это сделать. Вы дали уже готовый запрос?
15 апр 18, 20:44    [21341108]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на выборку  [new]
invm
Member

Откуда: Москва
Сообщений: 9351
OlegEgorov11
Вы дали уже готовый запрос?
Да.
15 апр 18, 20:52    [21341116]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на выборку  [new]
OlegEgorov11
Member

Откуда:
Сообщений: 92
invm, Спасибо
15 апр 18, 21:04    [21341128]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на выборку  [new]
OlegEgorov11
Member

Откуда:
Сообщений: 92
invm, запрос работает, но есть проблема. Последний столбец с номерами, он мне очень мешает. Если я создаю еще одну таблицу @v b и помещаю результат запроса в нее, а из нее уже выбираю без столбца номеров(или даже с ним), то номера строк идут очень странно. То есть 1.2.3.4 до 244, потом 277, 245,246 и т.д до 276, 278, 279 и опять пока такая же ерунда не случится, из за чего это может быть?
16 апр 18, 19:36    [21343399]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на выборку  [new]
invm
Member

Откуда: Москва
Сообщений: 9351
OlegEgorov11,

Без предложения order by, порядок строк в результирующем наборе может быть любым.
16 апр 18, 20:08    [21343456]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на выборку  [new]
OlegEgorov11
Member

Откуда:
Сообщений: 92
invm, без over by здесь: row_number() over (order by (select 1)), т.е row_number() over (select 1)? не значит ли это что, скажем, вторая строка станет 10? ну, с over by был порядок 1,2,3,4,5,6 - где по сути 2,4,6 строки были продолжением строк 1,3,5. Без over by будет так: 3,4,1,2,5,6 или так: 1,5,2,6,4,3?
16 апр 18, 20:29    [21343488]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на выборку  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5111
если вам не нужно поле n то его вовсе необязательно выводить на экспорт
declare @p table (id int identity, p1 char(2), p2 char(2), p3 char(2), p4 char(2), p5 char(2))

insert @p (p1, p2, p3, p4, p5)
values
	('A1', 'B1', 'C1', 'D1', 'E1'),
	('A2', 'B2', 'C2', 'D2', 'E2'),
	('A3', 'B3', 'C3', 'D3', 'E3')

select
case when a.n = 1 then p.p1 else p.p4 end as p1,
case when a.n = 1 then p.p2 else p.p5 end as p2,
case when a.n = 1 then p.p3 end as p3
from
@p p
cross apply (values (1), (2)) a(n)
order by
row_number() over (order by p.id, a.n)
16 апр 18, 23:00    [21343793]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на выборку  [new]
OlegEgorov11
Member

Откуда:
Сообщений: 92
Дедушка, именно то, что нужно, большое спасибо
17 апр 18, 20:07    [21346651]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить