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

Откуда:
Сообщений: 340
есть таблица

имя фамилия телефон

вася васильев 1111111
вася васильев 2222222

как сделать выборку что бы получилось

вася васильев 1111111, 2222222
22 сен 09, 13:15    [7692075]     Ответить | Цитировать Сообщить модератору
 Re: конкатенация  [new]
PaulYoung
Member

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

тута
22 сен 09, 13:17    [7692100]     Ответить | Цитировать Сообщить модератору
 Re: конкатенация  [new]
_unkind_
Member

Откуда:
Сообщений: 340
PaulYoung,

ок, а если

вася васильев г. киев 1111111
вася васильев м. Киев 2222222

нужно что бы получилось

вася васильев г. киев 1111111, 2222222

что бы выбирало что-то одно
22 сен 09, 13:26    [7692165]     Ответить | Цитировать Сообщить модератору
 Re: конкатенация  [new]
_unkind_
Member

Откуда:
Сообщений: 340
select surname, name ,(select ltrim(rtrim(phonenumber))+ ', ' from [tbl] t2
where t1.surname=t2.surname and t1.name=t2.name for xml path('') )
from [tbl] t1
group by surname, name
having count(*)>1

сюда еще нужно добавить адресс но что бы по нему не делалась группировка
22 сен 09, 13:35    [7692234]     Ответить | Цитировать Сообщить модератору
 Re: конкатенация  [new]
PaulYoung
Member

Откуда: Москва
Сообщений: 2549
_unkind_
select surname, name ,(select ltrim(rtrim(phonenumber))+ ', ' from [tbl] t2
where t1.surname=t2.surname and t1.name=t2.name for xml path('') )
from [tbl] t1
group by surname, name
having count(*)>1

сюда еще нужно добавить адресс но что бы по нему не делалась группировка
OUTER APPLY?
22 сен 09, 13:38    [7692254]     Ответить | Цитировать Сообщить модератору
 Re: конкатенация  [new]
_unkind_
Member

Откуда:
Сообщений: 340
PaulYoung
[quot _unkind_]

OUTER APPLY?


???что это) как его сюда всунуть
22 сен 09, 13:42    [7692286]     Ответить | Цитировать Сообщить модератору
 Re: конкатенация  [new]
PaulYoung
Member

Откуда: Москва
Сообщений: 2549
_unkind_
PaulYoung
[quot _unkind_]

OUTER APPLY?


???что это) как его сюда всунуть
если >= 2005, то как-то так
SELECT x.surname, x.name, w.address
FROM
(
select surname, name ,(select ltrim(rtrim(phonenumber))+ ', ' from [tbl] t2
where t1.surname=t2.surname and t1.name=t2.name for xml path('') )
from [tbl] t1
group by surname, name
having count(*)>1
) x
OUTER APPLY (SELECT address FROM [tbl] WHERE surname=x.surname and name=x.name) w
22 сен 09, 13:45    [7692321]     Ответить | Цитировать Сообщить модератору
 Re: конкатенация  [new]
_unkind_
Member

Откуда:
Сообщений: 340
PaulYoung,

Msg 8155, Level 16, State 2, Line 2
Для столбца 3 таблицы "x" не указан столбец.
22 сен 09, 13:50    [7692360]     Ответить | Цитировать Сообщить модератору
 Re: конкатенация  [new]
PaulYoung
Member

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

так укажите его алиас, делов-то
SELECT x.surname, x.name, x.phone, w.address
FROM
(
select surname, name ,(select ltrim(rtrim(phonenumber))+ ', ' from [tbl] t2
where t1.surname=t2.surname and t1.name=t2.name for xml path('') ) as phone
from [tbl] t1
group by surname, name
having count(*)>1
) x
OUTER APPLY (SELECT address FROM [tbl] WHERE surname=x.surname and name=x.name) w
22 сен 09, 13:52    [7692377]     Ответить | Цитировать Сообщить модератору
 Re: конкатенация  [new]
_unkind_
Member

Откуда:
Сообщений: 340
PaulYoung,

еще нужно добавить top 1, а то выбирает больше чем нужно, спасибо

SELECT x.surname, x.name, x.phone, w.address
FROM
(
select surname, name ,(select ltrim(rtrim(phonenumber))+ ', ' from [tbl] t2
where t1.surname=t2.surname and t1.name=t2.name for xml path('') ) as phone
from [tbl] t1
group by surname, name
having count(*)>1
) x
OUTER APPLY (SELECT top 1 address FROM [tbl] WHERE surname=x.surname and name=x.name) w
22 сен 09, 14:06    [7692498]     Ответить | Цитировать Сообщить модератору
 Re: конкатенация  [new]
PaulYoung
Member

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

тогда уж в SELECT'e с TOP 1 и ORDER BY добавьте до кучи, а то не понятно, какой TOP 1 будет
22 сен 09, 14:08    [7692512]     Ответить | Цитировать Сообщить модератору
 Re: конкатенация  [new]
LSV
Member [заблокирован]

Откуда: Киев
Сообщений: 30817
Для сабжа я обычно делаю функцию. И потом вызываю ее во многих местах. Удобнее и нагляднее, чем мегазапросы с APPLY. Да и отформатировать резулт можно более кошерно.
22 сен 09, 15:41    [7693349]     Ответить | Цитировать Сообщить модератору
 Re: вот пример на PL-SQL  [new]
Alex Saratov
Member

Откуда: Sar city
Сообщений: 1
with t as ( select 'Маша' as name, 'F' as male from dual union all
select 'Даша' as name, 'F' as male from dual union all
select 'Паша' as name, 'M' as male from dual union all
select 'Саша' as name, 'M' as male from dual)
select
male,
max(sys_connect_by_path(name, ', '))
from
(select
t.*,
row_number() over(partition by male order by 1) rn
from
t)
start with
male in (select distinct male from t)
and rn = 1
connect by
male = prior male
and (rn-1) = prior rn
group by
male
25 сен 09, 09:01    [7706553]     Ответить | Цитировать Сообщить модератору
 Re: вот пример на PL-SQL  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Alex Saratov
with t as ( select 'Маша' as name, 'F' as male from dual union all
            select 'Даша' as name, 'F' as male from dual union all
            select 'Паша' as name, 'M' as male from dual union all
            select 'Саша' as name, 'M' as male from dual)
select
    male,
    max(sys_connect_by_path(name, ', '))
from
    (select
         t.*,
         row_number() over(partition by male order by 1) rn
     from
         t)
start with
    male in (select distinct male from t)
    and rn = 1
connect by         
    male = prior male
    and (rn-1) = prior rn
group by    
    male
Первой сообщение на форуме и не попал тематикой.
25 сен 09, 11:20    [7707124]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить