Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Получить в столбце запроса перечисление уникальных значений столбц через запятую или черту  [new]
Fur
Guest
Вообще SQLServer2005+, но лучше кросплатформенно.
В общем так. Как получить из:

idtypename
1AABC
2ABCD
3ACDE
4BDEF
5BEFG
6XFGH

Нечто вида "A":

idtypename
3A|B|XCDE
4A|B|XDEF
5A|B|XEFG

и второй вариант "B":

idtypename
3A|BCDE
4A|BDEF
5A|BEFG

То есть я беру вот так:

DECLARE @mytable table(id int NOT NULL, type varchar(1) NOT NULL, name varchar(10));
INSERT INTO @mytable (id, type, name) VALUES (1,'A','ABC')
INSERT INTO @mytable (id, type, name) VALUES (2,'A','BCD')
INSERT INTO @mytable (id, type, name) VALUES (3,'A','CDE')
INSERT INTO @mytable (id, type, name) VALUES (4,'B','DEF')
INSERT INTO @mytable (id, type, name) VALUES (5,'B','EFG')
INSERT INTO @mytable (id, type, name) VALUES (6,'X','FGH')
-- SELECT * FROM @mytable

SELECT t.id, t.type, t.name FROM @mytable t WHERE t.name LIKE '%E%'

Что написать вместо "t.type,"? Понятна идея?
Получить перечисление уникальных значений столбца type через запятую или черту (в одном столбце).
В варианте "А" по всей таблице, в варианте "В" только по выборке. Знаю как это сделать при помощи самописной функции, но интересно можно ли обойтись без.
10 июл 13, 16:23    [14548057]     Ответить | Цитировать Сообщить модератору
 Re: Получить в столбце запроса перечисление уникальных значений столбц через запятую или черту  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Fur
кросплатформенно

Кроссплатформенной агрегации строковых значений в SQL не существует.

Fur
Вообще SQLServer2005+

Сложение символьных полей в запросе
10 июл 13, 16:34    [14548154]     Ответить | Цитировать Сообщить модератору
 Re: Получить в столбце запроса перечисление уникальных значений столбц через запятую или черту  [new]
Fur
Guest
Гость333
не существует

Это же плохо!
Гость333
Сложение символьных полей в запросе

Спасибо огромное, что-то поисковик по моей формулировке куда угодно отправлял, но только не туда.
А можно ли как-то убрать лишние пробелы между значениями и лишнюю последнюю черту?:

idVALSname
3A| B| X|CDE
4A| B| X|DEF
5A| B| X|EFG

DECLARE @mytable table(id int NOT NULL, type varchar(1) NOT NULL, name varchar(10));
INSERT INTO @mytable (id, type, name) VALUES (1,'A','ABC')
INSERT INTO @mytable (id, type, name) VALUES (2,'A','BCD')
INSERT INTO @mytable (id, type, name) VALUES (3,'A','CDE')
INSERT INTO @mytable (id, type, name) VALUES (4,'B','DEF')
INSERT INTO @mytable (id, type, name) VALUES (5,'B','EFG')
INSERT INTO @mytable (id, type, name) VALUES (6,'X','FGH')

SELECT * FROM @mytable

SELECT
	t.id,
	(SELECT DISTINCT
		t_sub.type+'|' AS 'data()'
	FROM
		@mytable t_sub
	--WHERE t_sub.name LIKE '%E%'	--	раскомментировать для получения варианта "В"
	FOR XML PATH('')
	) AS VALS,
	t.name
FROM
	@mytable t
WHERE
	t.name LIKE '%E%'
10 июл 13, 17:39    [14548597]     Ответить | Цитировать Сообщить модератору
 Re: Получить в столбце запроса перечисление уникальных значений столбц через запятую или черту  [new]
Guf
Member

Откуда: Новосибирск
Сообщений: 650
Fur
А можно ли как-то убрать лишние пробелы между значениями и лишнюю последнюю черту?

ага
SELECT
	t.id,
	REPLACE(STUFF(x.VALS, 1, 1, ''), ' |', '|'),
	t.name
FROM
	@mytable t
	CROSS JOIN (
	            SELECT DISTINCT 
	               '|'+t_sub.type AS 'data()'
	                FROM @mytable t_sub
	                --WHERE t_sub.name LIKE '%E%'	--	раскомментировать для получения варианта "В"
	                FOR XML PATH('')
	           ) x(VALS)
WHERE
	t.name LIKE '%E%'
11 июл 13, 06:33    [14550044]     Ответить | Цитировать Сообщить модератору
 Re: Получить в столбце запроса перечисление уникальных значений столбц через запятую или черту  [new]
Fur
Guest
гм.. Любопытно, спасибо! А вы тоже поддерживаете что кроссплатформенного способа нету?
Как все эти штуки насчёт нагрузки на сервер?
11 июл 13, 12:38    [14551690]     Ответить | Цитировать Сообщить модератору
 Re: Получить в столбце запроса перечисление уникальных значений столбц через запятую или черту  [new]
Guf
Member

Откуда: Новосибирск
Сообщений: 650
Fur
А вы тоже поддерживаете что кроссплатформенного способа нету?

Не, ну почему же, курсор... НО курсор нужно использвать только когда другого выхода нет.

Fur
Как все эти штуки насчёт нагрузки на сервер?

Я никогда не мерял. "С точки зрения банальной эрудиции вится, что" 10 строк не критично, а строка собранная из 1 млн. значений нафиг никому не нужна, и является ошибкой проектирования, имхо.
11 июл 13, 13:35    [14552176]     Ответить | Цитировать Сообщить модератору
 Re: Получить в столбце запроса перечисление уникальных значений столбц через запятую или черту  [new]
Fur
Guest
Тоже верно. С:

В общем итоговый вариант примерно как-то так:

DECLARE @mytable table(id int NOT NULL, type varchar(1) NOT NULL, name varchar(10));
INSERT INTO @mytable (id, type, name) VALUES (1,'A','ABC')
INSERT INTO @mytable (id, type, name) VALUES (2,'A','BCD')
INSERT INTO @mytable (id, type, name) VALUES (3,'A','CDE')
INSERT INTO @mytable (id, type, name) VALUES (4,'B','DEF')
INSERT INTO @mytable (id, type, name) VALUES (5,'B','EFG')
INSERT INTO @mytable (id, type, name) VALUES (6,'X','FGH')

SELECT * FROM @mytable

SELECT
	t.id,
	REPLACE(REPLACE((SELECT DISTINCT
				t_sub.type+'|' AS 'data()'
			FROM
				@mytable t_sub
			FOR XML PATH('')
	), '| ', ','), '|', '') AS DISTINCT_VALS_ALL,
	t.name
FROM
	@mytable t
WHERE
	t.name LIKE '%E%'

SELECT
	t.id,
	REPLACE(REPLACE((SELECT DISTINCT
				t_sub.type+'|' AS 'data()'
			FROM
				@mytable t_sub
			WHERE
				t_sub.name LIKE '%E%'
			FOR XML PATH('')
	), '| ', ','), '|', '') AS DISTINCT_VALS_CURRENT,
	t.name
FROM
	@mytable t
WHERE
	t.name LIKE '%E%'

Guf
Не, ну почему же, курсор... НО курсор нужно использвать только когда другого выхода нет.

Где можно почитать подробнее про это?
11 июл 13, 14:56    [14552815]     Ответить | Цитировать Сообщить модератору
 Re: Получить в столбце запроса перечисление уникальных значений столбц через запятую или черту  [new]
Guf
Member

Откуда: Новосибирск
Сообщений: 650
Fur,
Про что почитать?
Про синтаксис курсора или про курсор - зло

Вот сдесь 12981529, например, описан вариант с курсором
12 июл 13, 09:36    [14555570]     Ответить | Цитировать Сообщить модератору
 Re: Получить в столбце запроса перечисление уникальных значений столбц через запятую или черту  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1873
SELECT id,stuff((select distinct ','+type from @mytable for XML path('')),1,1,'') [type],NAME
FROM @mytable
WHERE NAME like '%E%'
12 июл 13, 12:04    [14556875]     Ответить | Цитировать Сообщить модератору
 Re: Получить в столбце запроса перечисление уникальных значений столбц через запятую или черту  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Guf
Fur
А вы тоже поддерживаете что кроссплатформенного способа нету?

Не, ну почему же, курсор...

И вы можете привести пример кроссплатформенного курсора?
12 июл 13, 12:15    [14556972]     Ответить | Цитировать Сообщить модератору
 Re: Получить в столбце запроса перечисление уникальных значений столбц через запятую или черту  [new]
Guf
Member

Откуда: Новосибирск
Сообщений: 650
Гость333,
Фразу ТС о кросплатформенности
Fur
Вообще SQLServer2005+, но лучше кросплатформенно.

я понял исключительно в разрезе MS SQL Server. Как если бы автор сказал "Вообще SQLServer2005+, но лучше чтоб работало и на боее ранних версиях."
12 июл 13, 12:30    [14557117]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить