powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Группировка символьных значений в одну строку?!?
9 сообщений из 9, страница 1 из 1
Группировка символьных значений в одну строку?!?
    #32042366
Gennady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Может кто подскажет:

Есть таблица People - сотрудники,
а также 2-ая таблица Child - дети.

Вопрос: Можно ли получить запросом
детей сотрудника в одну строчку?

Примерно так:
....1 поле................2 поле.......
Сотрудник 1........Сын, Сын, Дочь
Сотрудник 2........Сын, Дочь
..
...
Рейтинг: 0 / 0
Группировка символьных значений в одну строку?!?
    #32042375
Dominic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно. С большими ограничениями и накладными расходами. Например, мой пример работает, если максимальное количество детей не больше трех:

CREATE TABLE #Employees (emp_id INT, emp_name VARCHAR(50))
CREATE TABLE #Children (child_id INT IDENTITY(1,1), emp_id INT, status VARCHAR(4), child_name VARCHAR(50))
INSERT INTO #Employees VALUES (1, 'Иванов')
INSERT INTO #Employees VALUES (2, 'Петров')
INSERT INTO #Employees VALUES (3, 'Сидоров')
INSERT INTO #Children (emp_id, status, child_name) VALUES (1, 'сын', 'Вася')
INSERT INTO #Children (emp_id, status, child_name) VALUES (1, 'сын', 'Петя')
INSERT INTO #Children (emp_id, status, child_name) VALUES (1, 'дочь', 'Маня')
INSERT INTO #Children (emp_id, status, child_name) VALUES (2, 'сын', 'Коля')
INSERT INTO #Children (emp_id, status, child_name) VALUES (2, 'дочь', 'Оля')
INSERT INTO #Children (emp_id, status, child_name) VALUES (3, 'сын', 'Боря')

SELECT emp_name AS [кормильцы], CH1.child_id AS [CH1], CH2.child_id AS [CH2], CH3.child_id AS [CH3], RTRIM(ISNULL(CH1.child_name, '') + ' ' + ISNULL(CH2.child_name, '') + ' ' + ISNULL(CH3.child_name, '')) AS [нахлебники]
FROM #Employees EMP LEFT JOIN #Children CH1 ON EMP.emp_id = CH1.emp_id
LEFT JOIN #Children CH2 ON EMP.emp_id = CH2.emp_id AND CH1.child_id < CH2.child_id
LEFT JOIN #Children CH3 ON EMP.emp_id = CH3.emp_id AND CH1.child_id < CH2.child_id AND CH2.child_id < CH3.child_id
WHERE ISNULL(CH1.child_id, 0) + ISNULL(CH2.child_id, 0) + ISNULL(CH3.child_id, 0) = (SELECT SUM(child_id) FROM #Children WHERE emp_id = EMP.emp_id)

DROP TABLE #Employees
DROP TABLE #Children

С другой стороны, запрос достаточно детерминирован - можно написать процедуру, выбирающую по максимальному количеству детей ту или иную конструкцию запроса.
IMHO, такие вещи по возможности лучше делать:
1) на клиенте: Два набора записей (сотрудники, дети) с прокруткой только вперед и отсортированные по сотрудникам (чтобы можно было двигать курсоры по соответствующим записям); и третий несвязанный набор, в который пишутся результаты обработки - его можно подвязать к гриду.
2) на сервере, но с курсорами по алгоритму 1), вместо третьего набора - временная таблица.
3) поддерживать целевое поле в таблице сотрудников тригерами таблицы с детьми. - Я бы выбрал этот способ.

P.S. Я там специально подкрасил красненьким один из LEFT`ов: так запрос выводит всех сотрудников. Если заменить его на INNER, то только сотрудников, имеющих детей
...
Рейтинг: 0 / 0
Группировка символьных значений в одну строку?!?
    #32042382
~Bazul~
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если SQL2000 то пишите код в пользовательскую функцию:
Код: plaintext
1.
2.
3.
4.
5.
6.
create function GetChild(@parent int) 
RETURNS varchar( 300 )
as
declare @child_s varchar( 300 )
set @child_s=''
select @child_s=@child_s+child.Имя from child where child.Parent=@parent
return @child_s


потом её пользуете в запросе
Код: plaintext
1.
select parent.Имя,Child_all=GetChild(parent.Key)
from parent 
...
Рейтинг: 0 / 0
Группировка символьных значений в одну строку?!?
    #32042387
Dominic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Зёма ~Bazul~,
не совсем понял, что Вы хотели сказать своим кодом: как в UDF детишки-то (ну бывает их больше одного в одной семье - что тут поделать) собираются в одной переменной?
...
Рейтинг: 0 / 0
Группировка символьных значений в одну строку?!?
    #32042394
Dominic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Но идея с UDF в ситуации, когда ни клиента ни тригера для одного запроса ваять неохота - хороший выход. Типа:

CREATE FUNCTION GetChild(@father INT)
RETURNS VARCHAR(300)
AS
BEGIN
DECLARE @child_name VARCHAR(50), @children VARCHAR(300)
DECLARE children_cur CURSOR FORWARD_ONLY
FOR SELECT child_name FROM Children WHERE emp_id = @father

OPEN children_cur
SET @children = ''
FETCH NEXT FROM children_cur INTO @child_name

WHILE @@FETCH_STATUS = 0
BEGIN
SET @children = @children + ' ' + @child_name
FETCH NEXT FROM children_cur INTO @child_name
END
DEALLOCATE children_cur
SET @children = LTRIM(@children)
RETURN @children
END
...
Рейтинг: 0 / 0
Группировка символьных значений в одну строку?!?
    #32042405
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Dominic
что по Вашему вернет этот скрипт? :)
Код: plaintext
1.
2.
3.
4.
declare @s varchar( 2000 )
set @s=''
select @s=@s+'*' from sysobjects
select @s
...
Рейтинг: 0 / 0
Группировка символьных значений в одну строку?!?
    #32042416
~Bazul~
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to Dominic
не совсем понял, что Вы хотели сказать своим кодом: как в UDF детишки-то (ну бывает их больше одного в одной семье - что тут поделать) собираются в одной переменной?
Так запусти скрипт, и посмотри как все детишки соберутся в одной строке. :-))
На самом деле они вначале собираются в переменнной @child_s.
Болле чем очевидно, что в задачке СуперСержа вернется строка, состоящая из стольки звездочек, сколько строк в таблице sysobjects. Неверующие_фомы могут проверить.
...
Рейтинг: 0 / 0
Группировка символьных значений в одну строку?!?
    #32042475
Dominic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Осознал! Каюсь! Беру на вооружение.
...
Рейтинг: 0 / 0
Группировка символьных значений в одну строку?!?
    #32042992
Gennady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо всем кто помог....

1-я функция (без курсора) конечно
работает гораздо шустрей (доли секунды)
против 2-ой которая на тех же ~1000 человек
работала ~8 сек.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Группировка символьных значений в одну строку?!?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]