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

Откуда: Ростов- на- Дону
Сообщений: 564
Запрос, например,

select location, count(*) No from all__book where docid=1198 group by location

дает

АУЛ 142
КГД 2
КНР 1

а нужно получить строку 'АУЛ 142;КГД 2;КНР 1' как возврат функции getloc (docid).
Знаю, что можно, но как- может кто подскажет?
9 дек 13, 15:54    [15265404]     Ответить | Цитировать Сообщить модератору
 Re: Преобразовать столбец в строку  [new]
Ruuu
Member

Откуда: Иркутск
Сообщений: 4272
topdon,

Сложение символьных полей в запросе
9 дек 13, 16:02    [15265486]     Ответить | Цитировать Сообщить модератору
 Re: Преобразовать столбец в строку  [new]
topdon
Member

Откуда: Ростов- на- Дону
Сообщений: 564
Ruuu,

Большое человеческое спасибо, Вы сняли у меня последний камень с плеч!

--Вариант 1
select [docid] ,( select [location]+': '+cast([No] as nvarchar)+ ',' as 'data()'
from (select docid, location, count(*) No from library2.dbo.all__book
where subdb='book' and docid=1198
group by docid, location) t2
where t1.[docid]=t2.[docid] for xml path('') ) Sigla
from (select docid, location, count(*) No from library2.dbo.all__book
where subdb='book' and docid=1198
group by docid, location) t1
group by [docid]

-- Промежуточный результат
1198 АУЛ 142
1198 КГД 2
1198 КНР 1
1198 Общ. 2
1198 ЧЗ 3

--Результат
1198 АУЛ: 142, КГД: 2, КНР: 1, Общ.: 2, ЧЗ: 3,

Но хоть убей, не понимаю, как это работает!! Видимо все дело в этой штуке
where t1.[docid]=t2.[docid] for xml path('') ) Sigla

Но функцию из этого создать не могу

create function GetSigla (@docid int, @subdb varchar(15)) returns varchar (100)
as begin
return (select [docid] ,( select [location]+': '+cast([No] as nvarchar)+ ',' as 'data()'
from (select docid, location, count(*) No from library2.dbo.all__book
where subdb=@subdb and docid=@docid group by docid, location) t2
where t1.[docid]=t2.[docid] for xml path('') ) Sigla
from (select docid, location, count(*) No from library2.dbo.all__book
where subdb=@subdb and docid=@docid
group by docid, location) t1
group by [docid])
end

Сообщение 116, уровень 16, состояние 1, процедура GetSigla, строка 3
Only one expression can be specified in the select list when the subquery is not introduced with EXISTS.
10 дек 13, 10:29    [15269038]     Ответить | Цитировать Сообщить модератору
 Re: Преобразовать столбец в строку  [new]
Ruuu
Member

Откуда: Иркутск
Сообщений: 4272
topdon,

Вы уверены, что этот запрос у вас возвращает строку?
select [docid] ,( select [location]+': '+cast([No] as nvarchar)+ ',' as 'data()'
from (select docid, location, count(*) No from library2.dbo.all__book
where subdb=@subdb and docid=@docid group by docid, location) t2
where t1.[docid]=t2.[docid] for xml path('') ) Sigla
from (select docid, location, count(*) No from library2.dbo.all__book
where subdb=@subdb and docid=@docid
group by docid, location) t1
group by [docid]


ЗЫ: есть тэги, которые позволяют оформлять код в читабельном виде с отступами
10 дек 13, 11:11    [15269388]     Ответить | Цитировать Сообщить модератору
 Re: Преобразовать столбец в строку  [new]
Glory
Member

Откуда:
Сообщений: 104751
create function GetSigla (@docid int, @subdb varchar(15)) returns varchar (100)
as begin
return (select [docid] ,( select [location]+': '+cast([No] as nvarchar)+ ',' as 'data()'
from (select docid, location, count(*) No from library2.dbo.all__book
where subdb=@subdb and docid=@docid group by docid, location) t2
where t1.[docid]=t2.[docid] for xml path('') ) Sigla
from (select docid, location, count(*) No from library2.dbo.all__book
where subdb=@subdb and docid=@docid
group by docid, location) t1
group by [docid])
end
как вы собираетесь поместить в возвращаемое значение _несколько_ полей результата ?
10 дек 13, 11:14    [15269422]     Ответить | Цитировать Сообщить модератору
 Re: Преобразовать столбец в строку  [new]
topdon
Member

Откуда: Ростов- на- Дону
Сообщений: 564
Glory,
запрос

select [docid] ,( select [location]+': '+cast([No] as nvarchar)+ ',' as 'data()'
from (select docid, location, count(*) No from library2.dbo.all__book
where subdb='book' and docid=1131 group by docid, location) t2
where t1.[docid]=t2.[docid] for xml path('') ) Sigla
from (select docid, location, count(*) No from library2.dbo.all__book
where subdb='book' and docid=1131
group by docid, location) t1
group by [docid]


возвращает

docid Sigla
------------------------------------
1131 АУЛ: 24, КГД: 2, КНР: 1, ЧЗ: 3,

не понимаю, почему не дает создать функцию?
10 дек 13, 11:48    [15269747]     Ответить | Цитировать Сообщить модератору
 Re: Преобразовать столбец в строку  [new]
Glory
Member

Откуда:
Сообщений: 104751
topdon
возвращает

docid Sigla
------------------------------------
1131 АУЛ: 24, КГД: 2, КНР: 1, ЧЗ: 3,

не понимаю, почему не дает создать функцию?

Ееще раз вопрос - как вы собрались поместить 2(два !) поля результата в 1(один !) выходной параметр функции ?
Именно это и написано в сообщении сервера - Only one expression can be specified in the select list
10 дек 13, 11:53    [15269796]     Ответить | Цитировать Сообщить модератору
 Re: Преобразовать столбец в строку  [new]
topdon
Member

Откуда: Ростов- на- Дону
Сообщений: 564
Glory,
Да, моя глупость!
10 дек 13, 11:54    [15269804]     Ответить | Цитировать Сообщить модератору
 Re: Преобразовать столбец в строку  [new]
Matroskin
Member

Откуда: Жатай->Подольск
Сообщений: 137
topdon,

Можно так
SELECT location AS [text()] FROM (select location, count(*) No from all__book where docid=1198 group by location) FOR XML PATH ('')
10 дек 13, 12:57    [15270479]     Ответить | Цитировать Сообщить модератору
 Re: Преобразовать столбец в строку  [new]
topdon
Member

Откуда: Ростов- на- Дону
Сообщений: 564
topdon,

создал функцию

create function [dbo].[GetSigla](@subdb varchar(20), @docid int) returns varchar (200)
as begin
return(
select ( select [location]+': '+cast([No] as nvarchar)+ ',' as 'data()' 
from (select docid, location, count(*) No from library2.dbo.all__book
where subdb=@subdb and docid=@docid
group by docid, location) t2 
where t1.[docid]=t2.[docid] for xml path('') ) Sigla
from (select docid, location, count(*) No from library2.dbo.all__book
where subdb=@subdb and docid=@docid
group by docid, location) t1
group by [docid])
end


она работает

select distinct top 10 docid, libra1.dbo.GetSigla ('book', docid) from library2.dbo.all__book 
where subdb = 'book'


1130 АУЛ: 7, КНР: 1, ЧЗ: 2,
3630 АУЛ: 15, КГД: 1, КНР: 1, ЧЗ: 3,
4316 АУЛ: 20,
3631 АУЛ: 24, КГД: 1, КНР: 1, Общ.: 2, ЧЗ: 2,
3632 АУЛ: 16, КГД: 1, КНР: 1, ЧЗ: 2,
3633 АНЛ: 5, АУЛ: 24, ЧЗЮФ: 1,
3634 АУЛ: 12,
3635 АУЛ: 10, КНР: 1, Общ.: 1, ЧЗ: 1, ЧЗЮФ: 2,
3636 АУЛ: 48, ЧЗ: 2,
1135 АУЛ: 5,

но чувствуется, довольно долговато.
10 дек 13, 13:01    [15270532]     Ответить | Цитировать Сообщить модератору
 Re: Преобразовать столбец в строку  [new]
topdon
Member

Откуда: Ростов- на- Дону
Сообщений: 564
Matroskin
topdon,

Можно так
SELECT location AS [text()] FROM (select location, count(*) No from all__book where docid=1198 group by location) FOR XML PATH ('')


Попробовал

SELECT location AS [text()] FROM 
(select location, count(*) No from all__book where docid=1198 group by location) FOR XML PATH ('')


и какая- то ошибка

Сообщение 156, уровень 15, состояние 1, строка 1
Incorrect syntax near the keyword 'FOR'.

я пока не знаю этих команд.
10 дек 13, 13:15    [15270685]     Ответить | Цитировать Сообщить модератору
 Re: Преобразовать столбец в строку  [new]
antbr
Member

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

пробуйте так
SELECT location + ' ' + convert(varchar, No) + ';'
FROM 
(select location, count(*) No 
from all__book 
where docid=1198 
group by location) T
FOR XML PATH ('')
10 дек 13, 17:04    [15272898]     Ответить | Цитировать Сообщить модератору
 Re: Преобразовать столбец в строку  [new]
topdon
Member

Откуда: Ростов- на- Дону
Сообщений: 564
antbr
topdon,

пробуйте так
SELECT location + ' ' + convert(varchar, No) + ';'
FROM 
(select location, count(*) No 
from all__book 
where docid=1198 
group by location) T
FOR XML PATH ('')


Работает, но как- то странно

результат

XML-F52F2B61-18A1-11D1-B105-00805F49915B
---------------------------------------------------------------------------------------------
АНЛ(Ред. ф.) 1;АУЛ 142;АХЛ 3;КГД 2;КНР 4;Метод. каб. 1;Общ. 2;ЧЗ 3;ЧЗПИ 1;ЧЗЮФ 1;

все это как ссылка подчеркнуто и заголовок не могу изменить

С уважением
11 дек 13, 09:05    [15274878]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить