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

Откуда:
Сообщений: 131
Здравствуйте,
Есть в таблице строки с одинаковыми полями, как их объединять по общему полю в одну строку с добавлением полей?

Например:

FIO | a1 | a2 | a3 |
-----------------------
Иванов |1 | 2 | 3 |
-------------------------
Иванов |4 | 5 | 6 |
-------------------------
Иванов |7 | 8 | 9 |
-----------------------
Петров |a | b | c |
-----------------------
Петров |d | e | f |


В итоге должна получиться одна строка :

FIO | a1 | a2 | a3 | a4 | a5 | a6 | a7 | a8 | a9 |
-----------------------------------------------------
Иванов |1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
------------------------------------------------------
Петров |a | b | c | d | e | f | null |null |null |
11 апр 13, 14:01    [14167088]     Ответить | Цитировать Сообщить модератору
 Re: объединение строк в одной таблице  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22550
а если в исходных данный будет еще одна строка

Иванов |10 | 11 | 12 |

то каким должен стать результат?
11 апр 13, 14:05    [14167108]     Ответить | Цитировать Сообщить модератору
 Re: объединение строк в одной таблице  [new]
kolotov
Member

Откуда:
Сообщений: 131
Паганель,

На данный момент более 3-х строк с одинаковым полем не должно попадаться у меня.
11 апр 13, 14:08    [14167130]     Ответить | Цитировать Сообщить модератору
 Re: объединение строк в одной таблице  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22550
а на таких данных

Иванов |1 | 9 | 3 |
-------------------------
Иванов |7 | 5 | 6 |
-------------------------
Иванов |4 | 8 | 2 |

что должно получиться?
11 апр 13, 14:11    [14167144]     Ответить | Цитировать Сообщить модератору
 Re: объединение строк в одной таблице  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22550
ладно, пока так
-- test data
declare @t table(FIO nvarchar(20), a1 char(1), a2  char(1), a3 char(1))
insert into @t values
(N'Иванов', '1', '2', '3'),
(N'Иванов', '4', '5', '6'),
(N'Иванов', '7', '8', '9'),
(N'Петров', 'a', 'b', 'c'),
(N'Петров', 'd', 'e', 'f')
-- end of test data

;with C as (
   select FIO, a1, a2, a3
         ,row_number() over(partition by FIO order by a1, a2, a3) as RN
     from @t
)
select T1.FIO, T1.a1, T1.a2, T1.a3, T2.a1, T2.a2, T2.a3, T3.a1, T3.a2, T3.a3
  from C as T1
  left join C as T2 on T2.FIO = T1.FIO and T2.RN = 2
  left join C as T3 on T3.FIO = T1.FIO and T3.RN = 3
 where T1.RN = 1
11 апр 13, 14:18    [14167186]     Ответить | Цитировать Сообщить модератору
 Re: объединение строк в одной таблице  [new]
kolotov
Member

Откуда:
Сообщений: 131
Паганель
а на таких данных

Иванов |1 | 9 | 3 |
-------------------------
Иванов |7 | 5 | 6 |
-------------------------
Иванов |4 | 8 | 2 |

что должно получиться?


Иванов |1 | 9 | 3 |7 | 5 | 6 |4 | 8 | 2 |
11 апр 13, 14:26    [14167228]     Ответить | Цитировать Сообщить модератору
 Re: объединение строк в одной таблице  [new]
Гость333
Member

Откуда:
Сообщений: 3683
kolotov
Паганель
а на таких данных

Иванов |1 | 9 | 3 |
-------------------------
Иванов |7 | 5 | 6 |
-------------------------
Иванов |4 | 8 | 2 |

что должно получиться?


Иванов |1 | 9 | 3 |7 | 5 | 6 |4 | 8 | 2 |

А почему, например, не так:
Иванов |1 | 9 | 3 |4 | 8 | 2 |7 | 5 | 6 |
?
11 апр 13, 14:28    [14167243]     Ответить | Цитировать Сообщить модератору
 Re: объединение строк в одной таблице  [new]
kolotov
Member

Откуда:
Сообщений: 131
Паганель
ладно, пока так
-- test data
declare @t table(FIO nvarchar(20), a1 char(1), a2  char(1), a3 char(1))
insert into @t values
(N'Иванов', '1', '2', '3'),
(N'Иванов', '4', '5', '6'),
(N'Иванов', '7', '8', '9'),
(N'Петров', 'a', 'b', 'c'),
(N'Петров', 'd', 'e', 'f')
-- end of test data

;with C as (
   select FIO, a1, a2, a3
         ,row_number() over(partition by FIO order by a1, a2, a3) as RN
     from @t
)
select T1.FIO, T1.a1, T1.a2, T1.a3, T2.a1, T2.a2, T2.a3, T3.a1, T3.a2, T3.a3
  from C as T1
  left join C as T2 on T2.FIO = T1.FIO and T2.RN = 2
  left join C as T3 on T3.FIO = T1.FIO and T3.RN = 3
 where T1.RN = 1


Не могу понять, как перенести этот запрос на себя
вот пример моих полей в таблице
SELECT rq_num, obj_file, err, noteserr FROM flk
rq_num одинаковое поле (как FIO)
Помогите применить этот запрос на мою таблицу.
11 апр 13, 15:14    [14167605]     Ответить | Цитировать Сообщить модератору
 Re: объединение строк в одной таблице  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22550
-- test data
use tempdb
create table flk(rq_num nvarchar(20), obj_file char(1), err char(1), noteserr char(1))
insert into flk values
(N'Иванов', '1', '2', '3'),
(N'Иванов', '4', '5', '6'),
(N'Иванов', '7', '8', '9'),
(N'Петров', 'a', 'b', 'c'),
(N'Петров', 'd', 'e', 'f')
-- end of test data

;with C as (
   select rq_num, obj_file, err, noteserr
         ,row_number() over(partition by rq_num order by obj_file, err, noteserr) as RN
     from flk
)
select T1.rq_num, T1.obj_file, T1.err, T1.noteserr, T2.obj_file, T2.err, T2.noteserr, T3.obj_file, T3.err, T3.noteserr
  from C as T1
  left join C as T2 on T2.rq_num = T1.rq_num and T2.RN = 2
  left join C as T3 on T3.rq_num = T1.rq_num and T3.RN = 3
 where T1.RN = 1
11 апр 13, 15:22    [14167661]     Ответить | Цитировать Сообщить модератору
 Re: объединение строк в одной таблице  [new]
kolotov
Member

Откуда:
Сообщений: 131
Паганель,

я имел ввиду, что значения в таблице у меня уже есть
как сделать без этого

insert into flk values
(N'Иванов', '1', '2', '3'),
(N'Иванов', '4', '5', '6'),
(N'Иванов', '7', '8', '9'),
(N'Петров', 'a', 'b', 'c'),
(N'Петров', 'd', 'e', 'f')
-- end of test data
11 апр 13, 15:29    [14167740]     Ответить | Цитировать Сообщить модератору
 Re: объединение строк в одной таблице  [new]
Glory
Member

Откуда:
Сообщений: 104751
kolotov
как сделать без этого

Просто взять и НЕ выполнять ?
11 апр 13, 15:31    [14167749]     Ответить | Цитировать Сообщить модератору
 Re: объединение строк в одной таблице  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
select rq_num, obj_file, err, noteserr
         ,row_number() over(partition by rq_num order by obj_file, err, noteserr) as RN
     from[u] flk[/u]   ИМЯ ВАШЕЙ ТАБЛИЦЫ
11 апр 13, 15:31    [14167754]     Ответить | Цитировать Сообщить модератору
 Re: объединение строк в одной таблице  [new]
kolotov
Member

Откуда:
Сообщений: 131
Паганель,

Разобрался как сделать.
Можно ли еще переименовать поля в таблице? а то получаются поля с одинаковыми именами
11 апр 13, 16:28    [14168259]     Ответить | Цитировать Сообщить модератору
 Re: объединение строк в одной таблице  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22550
в таблице не может быть полей с одинаковыми именами
11 апр 13, 16:35    [14168314]     Ответить | Цитировать Сообщить модератору
 Re: объединение строк в одной таблице  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
select [Поле 1] = T1.rq_num, [Поле 2] =T1.obj_file, [Поле 3] =T1.err, [Поле 4] =T1.noteserr, [Поле 5] =T2.obj_file, [Поле 6] =T2.err, [Поле 7] =T2.noteserr, [Поле 8] =T3.obj_file, [Поле 9] =T3.err, [Поле 10] =T3.noteserr
  from C as T1
  left join C as T2 on T2.rq_num = T1.rq_num and T2.RN = 2
  left join C as T3 on T3.rq_num = T1.rq_num and T3.RN = 3
 where T1.RN = 1
11 апр 13, 16:37    [14168328]     Ответить | Цитировать Сообщить модератору
 Re: объединение строк в одной таблице  [new]
TheXeNd
Member

Откуда:
Сообщений: 8
Паганель,

Это круто СПАСИБО!
12 апр 13, 10:11    [14171122]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить