Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
 Значения чере запятую  [new]
assmsk
Member

Откуда:
Сообщений: 173
Есть таблица
Create table t ( name varchar(1), id int)
Insert into t(name,id) values ('a',1)
Insert into t(name,id) values ('a',2)
Insert into t(name,id) values ('a',3)
Insert into t(name,id) values ('b',1)
Insert into t(name,id) values ('b',4)

Как получить:
А 1,2,3
В 1,4

БЕЗ ИСПОЛЬЗОВАНИЯ:
1) циклов
2) переменных
3) рекурсии
4)xml path

Число строк заранее не известно
7 авг 17, 14:42    [20705496]     Ответить | Цитировать Сообщить модератору
 Re: Значения чере запятую  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36926
Ищите:

https://www.sql.ru/faq/faq_topic.aspx?fid=130
https://www.sql.ru/faq/faq_topic.aspx?fid=731
7 авг 17, 14:43    [20705505]     Ответить | Цитировать Сообщить модератору
 Re: Значения чере запятую  [new]
assmsk
Member

Откуда:
Сообщений: 173
Еще поправка, если есть повторяющиеся значения то выводить все
А 1,2,3,1,1,1,1
7 авг 17, 14:44    [20705511]     Ответить | Цитировать Сообщить модератору
 Re: Значения чере запятую  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36926
https://docs.microsoft.com/en-us/sql/t-sql/functions/string-agg-transact-sql
7 авг 17, 14:58    [20705557]     Ответить | Цитировать Сообщить модератору
 Re: Значения чере запятую  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7671
assmsk,
STRING_AGG()
7 авг 17, 15:08    [20705594]     Ответить | Цитировать Сообщить модератору
 Re: Значения чере запятую  [new]
982183
Member

Откуда: VL
Сообщений: 3351
Не, просто интересно, а чем не нравятся циклы?
Получится простой и понятный код
7 авг 17, 15:18    [20705622]     Ответить | Цитировать Сообщить модератору
 Re: Значения чере запятую  [new]
assmsk
Member

Откуда:
Сообщений: 173
2005ый сервер
7 авг 17, 15:18    [20705625]     Ответить | Цитировать Сообщить модератору
 Re: Значения чере запятую  [new]
assmsk
Member

Откуда:
Сообщений: 173
982183
Не, просто интересно, а чем не нравятся циклы?
Получится простой и понятный код


Лично мне очень нравятся) Но условие не позволяет))
7 авг 17, 15:19    [20705629]     Ответить | Цитировать Сообщить модератору
 Re: Значения чере запятую  [new]
Владислав Колосов
Member

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

функцию напишите. Она скроет переменную.
7 авг 17, 15:23    [20705648]     Ответить | Цитировать Сообщить модератору
 Re: Значения чере запятую  [new]
assmsk
Member

Откуда:
Сообщений: 173
Владислав Колосов
assmsk,

функцию напишите. Она скроет переменную.


Условие такое, что функцию тоже нельзя использовать.
7 авг 17, 15:28    [20705668]     Ответить | Цитировать Сообщить модератору
 Re: Значения чере запятую  [new]
env
Member

Откуда: Россия, Москва
Сообщений: 5982
assmsk,

Это условия учебного проекта или маразм архитектора?
7 авг 17, 15:36    [20705700]     Ответить | Цитировать Сообщить модератору
 Re: Значения чере запятую  [new]
assmsk
Member

Откуда:
Сообщений: 173
env
assmsk,

Это условия учебного проекта или маразм архитектора?


Такое задание в инст, согласен абсолютный абсурд
7 авг 17, 15:39    [20705714]     Ответить | Цитировать Сообщить модератору
 Re: Значения чере запятую  [new]
env
Member

Откуда: Россия, Москва
Сообщений: 5982
assmsk,

CLR можно использовать?
7 авг 17, 15:49    [20705763]     Ответить | Цитировать Сообщить модератору
 Re: Значения чере запятую  [new]
assmsk
Member

Откуда:
Сообщений: 173
env
assmsk,

CLR можно использовать?


Нет.


В общем запрос может быть любой извращенности производительность не имеет никакого значения.
Главное чтобы это был обычный select без использования with, без функций, циклов, переменных, xml path итд итп
7 авг 17, 15:53    [20705780]     Ответить | Цитировать Сообщить модератору
 Re: Значения чере запятую  [new]
Rankatan
Member

Откуда:
Сообщений: 250
select name, stuff((select CONCAT(',',id) from t where name=t2.name FOR XML raw,type, ELEMENTS).value('.','varchar(max)') ,1,1,'')
from t t2
group by name
7 авг 17, 16:08    [20705838]     Ответить | Цитировать Сообщить модератору
 Re: Значения чере запятую  [new]
iap
Member

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

а вы опубликуете здесь правильный ответ, когда вам его покажут?
7 авг 17, 16:09    [20705843]     Ответить | Цитировать Сообщить модератору
 Re: Значения чере запятую  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Rankatan
select name, stuff((select CONCAT(',',id) from t where name=t2.name FOR XML raw,type, ELEMENTS).value('.','varchar(max)') ,1,1,'')
from t t2
group by name
Сказано же: "Главное чтобы это был обычный select без использования ... xml path итд итп" :))
7 авг 17, 16:11    [20705856]     Ответить | Цитировать Сообщить модератору
 Re: Значения чере запятую  [new]
Rankatan
Member

Откуда:
Сообщений: 250
FOR XML raw походоит? Только CONCAT(',',id) нужно поменять на ','+cast(id as varchar) т.к. в 2005 нет такой функции
7 авг 17, 16:12    [20705860]     Ответить | Цитировать Сообщить модератору
 Re: Значения чере запятую  [new]
assmsk
Member

Откуда:
Сообщений: 173
iap,
особенность в том, что не предложив своего варианта ответ я не получу))

Если что то сам придумаю то напишу.
7 авг 17, 16:13    [20705862]     Ответить | Цитировать Сообщить модератору
 Re: Значения чере запятую  [new]
Shakill
Member

Откуда: мск
Сообщений: 1880
assmsk,

ну раз столько ограничений на способ решения, следует сказать преподавателю, что у тебя есть свои требования:
пусть id могут принимать значения только от 1 до 9 и ни шагу в сторону.
тогда подойдет такой вариант

select s.name, replace(convert(nvarchar(4000), s.summ), '0', ', ')
from (
	 select pow.name, summ =  sum(pow.idp)
	 from (
		  select c.name, idp = c.id * power(100, c.rn - 1)
		  from (
				select 
					 t.name, 
					 t.id,
					 rn = row_number() over (partition by t.name order by t.id desc)		  
				from t
		  ) as c
	 ) as pow
	 group by pow.name
) as s
7 авг 17, 16:20    [20705889]     Ответить | Цитировать Сообщить модератору
 Re: Значения чере запятую  [new]
assmsk
Member

Откуда:
Сообщений: 173
Shakill
assmsk,

ну раз столько ограничений на способ решения, следует сказать преподавателю, что у тебя есть свои требования:
пусть id могут принимать значения только от 1 до 9 и ни шагу в сторону.
тогда подойдет такой вариант

select s.name, replace(convert(nvarchar(4000), s.summ), '0', ', ')
from (
	 select pow.name, summ =  sum(pow.idp)
	 from (
		  select c.name, idp = c.id * power(100, c.rn - 1)
		  from (
				select 
					 t.name, 
					 t.id,
					 rn = row_number() over (partition by t.name order by t.id desc)		  
				from t
		  ) as c
	 ) as pow
	 group by pow.name
) as s


Если бы были такие рамки проблем бы не было, но id любое число допустимое в integer
7 авг 17, 16:23    [20705907]     Ответить | Цитировать Сообщить модератору
 Re: Значения чере запятую  [new]
Rankatan
Member

Откуда:
Сообщений: 250
select name,REPLACE(cast(SUM(z) as varchar(max)),'0',',') from 
(
	select name,cast(id as numeric(38,0))*power(100,ROW_NUMBER() OVER(partition by name order by id desc)) z 
	from t
) z
group by name

чуть неуспел
7 авг 17, 16:25    [20705920]     Ответить | Цитировать Сообщить модератору
 Re: Значения чере запятую  [new]
Rankatan
Member

Откуда:
Сообщений: 250
UNPIVOT не подойдет?
7 авг 17, 16:31    [20705949]     Ответить | Цитировать Сообщить модератору
 Re: Значения чере запятую  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Придётся дать на лапу!
7 авг 17, 16:32    [20705955]     Ответить | Цитировать Сообщить модератору
 Re: Значения чере запятую  [new]
env
Member

Откуда: Россия, Москва
Сообщений: 5982
Rankatan,

Как ты себе представляешь решение через unpivot со всеми прежними ограничениями?
7 авг 17, 16:39    [20705986]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить