powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как соединить строки при переносе из одной таблицы в другую?
4 сообщений из 4, страница 1 из 1
Как соединить строки при переносе из одной таблицы в другую?
    #32055839
Здравствуйте
Как дела?
А вот у меня проблемка появилась.
Может кто сможет помочь?

А суть такая.
Есть 2 таблицы.
В одной из них есть поля:
- год
- номер
- номер строки
- мемо

А в другой полей много больше, а я использую следующие:
-год
-номер

Эти поля соответствуют полям первой таблицы.
А надо во вторую таблицу добавить поле мемо.
Хитрым образом добавить.
В первой таблице ключ - это год+номер+номер строки
Во второй таблице ключ - это год+номер
А мемо надо добавить так(из первой таблицы):
(мемо где номер строки = 1) + char(10) + char(13) + (мемо где номер строки = 2) + char(10) + char(13) + ..... + char(10) + char(13) + (мемо где номер строки максимальный для данного года и номера).
Максимальные номера строк для каждого года и номера разные. В принципе могут быть пропущены номера строк, их тогда пропускать надо.

Помогите запрос написать.
Спасибо заранее.
Ну и все пока:)
...
Рейтинг: 0 / 0
Как соединить строки при переносе из одной таблицы в другую?
    #32056087
Oers
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прошу прощения, я не спец, в голову пришел только не лучший вариант с курсором. Может Вы что-то переработаете или все. А может это вообще не подходит...
Извините, если получилось "совсем не в тему".



Код: plaintext
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.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
IF NOT EXISTS (	SELECT * FROM SYSOBJECTS 
		WHERE ID = OBJECT_ID(N'[DBO].[tabl1]') 
		AND objectproperty(ID, N'IsUserTable') =  1 )begin
	create table dbo.tabl1 (
             num             integer   not null,   
             yr                char( 4 )   not null,
             num_st         integer   not null, 
             memo           char( 100 ) 	

	constraint pk1 primary key (num, yr, num_st)
	)
	
end
go

IF NOT EXISTS (	SELECT * FROM SYSOBJECTS 
		WHERE ID = OBJECT_ID(N'[DBO].[tabl2]') 
		AND objectproperty(ID, N'IsUserTable') =  1 )begin
	create table dbo.tabl2 (
             num        integer   not null,   
             yr          char( 4 )   not null,
             memo     char( 2000 )

	constraint pk2 primary key (num, yr)
	)
	
end

go

 /*TABL1*/ 

insert into dbo.tabl1(num, yr, num_st, memo)
values ( 1 ,'2000', 1 ,'QQQ')
insert into dbo.tabl1(num, yr, num_st, memo)
values ( 1 ,'2000', 3 ,'AAA')
insert into dbo.tabl1(num, yr, num_st, memo)
values ( 1 ,'2000', 5 ,'BBB')
insert into dbo.tabl1(num, yr, num_st, memo)
values ( 1 ,'2000', 7 ,'CCC')
insert into dbo.tabl1(num, yr, num_st, memo)
values ( 2 ,'2001', 2 ,'TTT')
insert into dbo.tabl1(num, yr, num_st, memo)
values ( 2 ,'2001', 10 ,'WWW')
insert into dbo.tabl1(num, yr, num_st, memo)
values ( 2 ,'2001', 11 ,'ZZZ')
insert into dbo.tabl1(num, yr, num_st, memo)
values ( 2 ,'2001', 13 ,'RRR')

 /*TABL2*/ 
insert into dbo.tabl2(num, yr)
values ( 1 ,'2000')
insert into dbo.tabl2(num, yr)
values ( 2 ,'2001')
go


declare
@num integer,
@yr varchar( 4 ),
@memo varchar( 2000 ),
@crlf varchar( 4 )

set @crlf= char( 10 )+ char( 13 )

declare CUR_T cursor 
for select num, yr
from tabl2
order by num, yr

open CUR_T
fetch CUR_T
into @num, @yr

while @@FETCH_STATUS =  0 

begin

set @memo=''
select @memo=@memo + rtrim(memo)+ @crlf from tabl1
where num=@num
and yr=@yr

update tabl2
set memo=left(rtrim(@memo), len(rtrim(@memo))- 2 )
where num=@num
and yr=@yr

fetch CUR_T
into @num, @yr
        		
end
close CUR_T
deallocate CUR_T

select * from tabl1
select* from tabl2	

 1 	 2000 	 1 	QQQ 
 1 	 2000 	 3 	AAA 
 1 	 2000 	 5 	BBB 
 1 	 2000 	 7 	CCC 
 2 	 2001 	 2 	TTT        
 2 	 2001 	 10 	WWW 
 2 	 2001 	 11 	ZZZ 
 2 	 2001 	 13 	RRR 


 1 	 2000 	QQQ  AAA  BBB  CCC   
 2 	 2001 	TTT  WWW  ZZZ  RRR  


...
Рейтинг: 0 / 0
Как соединить строки при переносе из одной таблицы в другую?
    #32056137
Фотография Александр Степанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Примерно так (без курсора):

кстати, этот прием описан на FAQ данного форума...

Код: plaintext
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.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
IF NOT EXISTS (	SELECT * FROM SYSOBJECTS 
		WHERE ID = OBJECT_ID(N'[tabl1]') 
		AND objectproperty(ID, N'IsUserTable') =  1 )begin
	create table tabl1 (
             num             integer   not null,   
             yr                nvarchar( 4 )   not null,
             num_st         integer   not null, 
             memo           nvarchar( 100 ) 	

	constraint pk1 primary key (num, yr, num_st)
	)
	
end
go

IF NOT EXISTS (	SELECT * FROM SYSOBJECTS 
		WHERE ID = OBJECT_ID(N'[tabl2]') 
		AND objectproperty(ID, N'IsUserTable') =  1 )begin
	create table tabl2 (
             num        integer   not null,   
             yr          varchar( 4 )   not null,
             memo     nvarchar( 2000 )

	constraint pk2 primary key (num, yr)
	)
	
end

go

 /*TABL1*/ 

insert into tabl1(num, yr, num_st, memo)
values ( 1 ,'2000', 1 ,'QQQ')
insert into tabl1(num, yr, num_st, memo)
values ( 1 ,'2000', 3 ,'AAA')
insert into tabl1(num, yr, num_st, memo)
values ( 1 ,'2000', 5 ,'BBB')
insert into tabl1(num, yr, num_st, memo)
values ( 1 ,'2000', 7 ,'CCC')
insert into tabl1(num, yr, num_st, memo)
values ( 2 ,'2001', 2 ,'TTT')
insert into tabl1(num, yr, num_st, memo)
values ( 2 ,'2001', 10 ,'WWW')
insert into tabl1(num, yr, num_st, memo)
values ( 2 ,'2001', 11 ,'ZZZ')
insert into tabl1(num, yr, num_st, memo)
values ( 2 ,'2001', 13 ,'RRR')

 /*TABL2*/ 
insert into tabl2(num, yr)
values ( 1 ,'2000')
insert into tabl2(num, yr)
values ( 2 ,'2001')
go

create table #tmp 
(
	pk int identity( 1 , 1 ) not null primary key clustered,
	num int not null, 
	yr varchar( 4 ) not null, 
	num_st int not null, 	
	memo nvarchar( 100 ) not null,
	concatenated_memo nvarchar( 2000 ) not null default ''
)

insert into #tmp (num,yr,num_st,memo)
Select
	t1.num,
	t1.yr,
	t1.num_st,
	t1.memo
From
	tabl1 t1
	inner join tabl2 t2
		on t1.yr=t2.yr and t1.num=t2.num
Order By
	t1.num, t1.yr, t1.num_st

DECLARE @num int, @yr varchar( 4 ), @c_m nvarchar( 2000 )

Update #tmp
Set
	@c_m=concatenated_memo=
		CASE 
			WHEN @num=num AND @yr=yr THEN @c_m+char( 10 )+char( 13 )+memo 
			ELSE memo 
		END,
	@num=num,
	@yr=yr

Select * from #tmp
Select 	num,yr,MAX(concatenated_memo) from #tmp Group By num,yr

drop table tabl1
drop table tabl2
drop table #tmp
...
Рейтинг: 0 / 0
Как соединить строки при переносе из одной таблицы в другую?
    #32056208
Здравствуйте еще раз.
Большое спасибо за помощь.

Я сам додумался.
Думал, что это можно более легким способом сделать, при помоще одного селекта с вложениями, да видать не получается так.

У меня вот такая процедура вышла. Работает вроде правильно.
Предварительно в таблицу 2 поле мемо добавил.
Да, в таблицах все поля текстовые. Нумерация строк начинается с 0.

CREATE PROCEDURE dbo.add_memo AS

declare @year varchar(4), @number varchar(4), @max_row int, @cur_row int, @memo varchar(8000)
set @year = ''
set @number = ''
declare year_number insensitive cursor
for select Isnull(year, 0), Isnull(number, 0) from table_2
open year_number
fetch from year_number into @year, @number
while @@fetch_status = 0
begin
select @max_row = max(convert(int,string_number)) from table_1 where year = @year and number = @number
set @cur_row = 0
set @memo = ''
while @cur_row <= @max_row
begin
if exists(select * from table_1 where year = @year and number = @number and convert(int, string_number) = @cur_row)
begin
select @memo= @memo + IsNull(string_memo, '') from table_1 where year = @year and number = @number and convert(int, string_number) = @cur_row
end
set @cur_row = @cur_row + 1
end
if @memo <> '' update table_2 set memo = @memo where year = @year and number = @number
fetch from year_number into @year, @number
end
close year_number
deallocate year_number


Еще раз большое спасибо.
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как соединить строки при переносе из одной таблицы в другую?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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