Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Запрос на выборку / 13 сообщений из 13, страница 1 из 1
15.04.2018, 19:02
    #39630471
OlegEgorov11
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на выборку
Помогите пожалуйста, есть запрос, который из таблицы вида:
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б либо как то по другому сделать?



Запрос:

Код: 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.
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
...
Рейтинг: 0 / 0
15.04.2018, 19:41
    #39630482
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на выборку
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
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);
...
Рейтинг: 0 / 0
15.04.2018, 19:58
    #39630487
OlegEgorov11
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на выборку
invm, подскажите, мне нужно вставить это вместо двух строк, где у меня values((0), (0)....и т.д?
...
Рейтинг: 0 / 0
15.04.2018, 20:09
    #39630490
Дедушка
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на выборку
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
...
Рейтинг: 0 / 0
15.04.2018, 20:26
    #39630497
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на выборку
OlegEgorov11invm, подскажите, мне нужно вставить это вместо двух строк, где у меня values((0), (0)....и т.д?Такое впечатление, что вы даже не пробовали выполнить предложенный мной запрос.
...
Рейтинг: 0 / 0
15.04.2018, 20:44
    #39630502
OlegEgorov11
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на выборку
invm, будет возможность только завтра это сделать. Вы дали уже готовый запрос?
...
Рейтинг: 0 / 0
15.04.2018, 20:52
    #39630503
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на выборку
OlegEgorov11Вы дали уже готовый запрос?Да.
...
Рейтинг: 0 / 0
15.04.2018, 21:04
    #39630506
OlegEgorov11
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на выборку
invm, Спасибо
...
Рейтинг: 0 / 0
16.04.2018, 19:36
    #39631104
OlegEgorov11
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на выборку
invm, запрос работает, но есть проблема. Последний столбец с номерами, он мне очень мешает. Если я создаю еще одну таблицу @v b и помещаю результат запроса в нее, а из нее уже выбираю без столбца номеров(или даже с ним), то номера строк идут очень странно. То есть 1.2.3.4 до 244, потом 277, 245,246 и т.д до 276, 278, 279 и опять пока такая же ерунда не случится, из за чего это может быть?
...
Рейтинг: 0 / 0
16.04.2018, 20:08
    #39631126
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на выборку
OlegEgorov11,

Без предложения order by, порядок строк в результирующем наборе может быть любым.
...
Рейтинг: 0 / 0
16.04.2018, 20:29
    #39631134
OlegEgorov11
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на выборку
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?
...
Рейтинг: 0 / 0
16.04.2018, 23:00
    #39631197
Дедушка
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на выборку
если вам не нужно поле n то его вовсе необязательно выводить на экспорт
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
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)
...
Рейтинг: 0 / 0
17.04.2018, 20:07
    #39632027
OlegEgorov11
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на выборку
Дедушка, именно то, что нужно, большое спасибо
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Запрос на выборку / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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