Переключение на Главную Страницу Страницы: [1] 2  ОтправитьПечать
Горячая тема (более 10 ответов) Собрать строки запроса в одну (число прочтений - 3931 )
Amel
Junior Member
**
Отсутствует


1С++ rulezzz!

Сообщений: 85
Местоположение: Украина, Винница
Зарегистрирован: 20. Ноября 2007
Пол: Мужской
Собрать строки запроса в одну
26. Сентября 2011 :: 05:50
Печать  
Есть строки в документе, в них - сотрудники. Нужно в журнале этих документов выводить в колонке всех сотрудников, которые указаны в этом документе.
Т.е. нужно как-то собрать их из таблицы строк в одну переменную запроса через запятую.
Как сделать это? Гугление что-то не помогает.
  

Восторгаюсь 1С++ и классами к ней!
Наверх
ICQ  
IP записан
 
vinogradoff
Full Member
***
Отсутствует



Сообщений: 107
Зарегистрирован: 06. Февраля 2010
Пол: Мужской
Re: Собрать строки запроса в одну
Ответ #1 - 26. Сентября 2011 :: 06:00
Печать  
При записи документа записывайте через запятую всех сотрудников из ТЧ в реквизит шапки документа и добавьте его в графу журнала.
  
Наверх
 
IP записан
 
Amel
Junior Member
**
Отсутствует


1С++ rulezzz!

Сообщений: 85
Местоположение: Украина, Винница
Зарегистрирован: 20. Ноября 2007
Пол: Мужской
Re: Собрать строки запроса в одну
Ответ #2 - 26. Сентября 2011 :: 06:07
Печать  
Хотелось бы без избыточности хранения данных.
Уверен, это можно сделать средствами SQL, только не знаю, как.
  

Восторгаюсь 1С++ и классами к ней!
Наверх
ICQ  
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Собрать строки запроса в одну
Ответ #3 - 26. Сентября 2011 :: 06:09
Печать  
Как-то так:

set nocount on

declare @id varchar(128)

set @id = ''

select top 10 @id = iddoc + ', ' + @id from _1sjourn (nolock)

select @id
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
Anatol
Senior Member
****
Отсутствует


тыц, пыц, тыц!!!

Сообщений: 412
Зарегистрирован: 24. Апреля 2009
Re: Собрать строки запроса в одну
Ответ #4 - 26. Сентября 2011 :: 06:12
Печать  
  
Наверх
wwwICQ  
IP записан
 
Amel
Junior Member
**
Отсутствует


1С++ rulezzz!

Сообщений: 85
Местоположение: Украина, Винница
Зарегистрирован: 20. Ноября 2007
Пол: Мужской
Re: Собрать строки запроса в одну
Ответ #5 - 26. Сентября 2011 :: 06:12
Печать  
Т.е. сформировать сначала временную таблицу с нужными строками, а затем использовать ее в основном запросе?
Спасибо. Ща буду пробовать.
  

Восторгаюсь 1С++ и классами к ней!
Наверх
ICQ  
IP записан
 
vinogradoff
Full Member
***
Отсутствует



Сообщений: 107
Зарегистрирован: 06. Февраля 2010
Пол: Мужской
Re: Собрать строки запроса в одну
Ответ #6 - 26. Сентября 2011 :: 08:01
Печать  
Amel писал(а) 26. Сентября 2011 :: 06:07:
Хотелось бы без избыточности хранения данных.
Уверен, это можно сделать средствами SQL, только не знаю, как.

Дополнительная нагрузка на сервер при прорисовке журнала. Если ресурсы позволяют, то слушайте г-на berezdetsky.
  
Наверх
 
IP записан
 
Amel
Junior Member
**
Отсутствует


1С++ rulezzz!

Сообщений: 85
Местоположение: Украина, Винница
Зарегистрирован: 20. Ноября 2007
Пол: Мужской
Re: Собрать строки запроса в одну
Ответ #7 - 26. Сентября 2011 :: 08:56
Печать  
Сделал вот такую функцию:

     |CREATE FUNCTION dbo.fn_Staff(@iddoc char(9))
     |RETURNS varchar as
     |BEGIN
     |DECLARE @st1 varchar
     |set @st1 = ''
     |  select @st1 = @st1 + $ДокС.Учасник + ', '
     |  from $ДокументСтроки.ПротоколНаради as ДокС (nolock)
     |  WHERE ДокС.IDDoc = @iddoc
     |RETURN (@st1)
     |END

Вызываю так:
dbo.fn_Staff(Жур.IDDoc) as Учасник

Постоянно возвращает пустую строку.
Подскажите, что не так делаю?
  

Восторгаюсь 1С++ и классами к ней!
Наверх
ICQ  
IP записан
 
Amel
Junior Member
**
Отсутствует


1С++ rulezzz!

Сообщений: 85
Местоположение: Украина, Винница
Зарегистрирован: 20. Ноября 2007
Пол: Мужской
Re: Собрать строки запроса в одну
Ответ #8 - 26. Сентября 2011 :: 09:02
Печать  
Все! Разобрался!
Спасибо всем!
  

Восторгаюсь 1С++ и классами к ней!
Наверх
ICQ  
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Собрать строки запроса в одну
Ответ #9 - 27. Сентября 2011 :: 01:34
Печать  
как-то у вас все сложно. можно же просто select distinct...
  
Наверх
 
IP записан
 
Amel
Junior Member
**
Отсутствует


1С++ rulezzz!

Сообщений: 85
Местоположение: Украина, Винница
Зарегистрирован: 20. Ноября 2007
Пол: Мужской
Re: Собрать строки запроса в одну
Ответ #10 - 10. Октября 2011 :: 08:46
Печать  
На временных таблицах неуклюжее решение получается. Сложно фильтровать записи.
Если кто-то сможет расписать на селектах эту задачу, буду очень признателен.
А то я сам в селектах не силен, а гугление подсказывает решение задачи только через функции (т.е. через "алгоритмический" SQL).
  

Восторгаюсь 1С++ и классами к ней!
Наверх
ICQ  
IP записан
 
zk96
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 320
Местоположение: Киев
Зарегистрирован: 15. Ноября 2009
Пол: Мужской
Re: Собрать строки запроса в одну
Ответ #11 - 10. Октября 2011 :: 13:26
Печать  
Я использую вьюхи с "FOR XML PATH".
При входе в систему, если это первый юзер, проверяю есть ли эти вьюхи(если монопольно то сначала удаляю их), если нет, то создаю.
Пример создания одной из них прилагаю. Если что-то в моем коде не ясно, напишу.
P.S.У меня SQL 2005.
  

CREATE_VIEW_ManufactureTechTasks.txt ( 14 KB | Загрузки )
Наверх
 
IP записан
 
Amel
Junior Member
**
Отсутствует


1С++ rulezzz!

Сообщений: 85
Местоположение: Украина, Винница
Зарегистрирован: 20. Ноября 2007
Пол: Мужской
Re: Собрать строки запроса в одну
Ответ #12 - 10. Октября 2011 :: 14:07
Печать  
Сразу вопрос, будет ли работать на скуле 2000?
Вычитал, что в 2000 работает "FOR XML EXPLICIT", а "FOR XML PATH" - не поддерживается.
  

Восторгаюсь 1С++ и классами к ней!
Наверх
ICQ  
IP записан
 
Amel
Junior Member
**
Отсутствует


1С++ rulezzz!

Сообщений: 85
Местоположение: Украина, Винница
Зарегистрирован: 20. Ноября 2007
Пол: Мужской
Re: Собрать строки запроса в одну
Ответ #13 - 12. Октября 2011 :: 08:48
Печать  
Если кому интересно, нашел решение.
Примерно вот такой запрос решает проблему:

Код
Выбрать все
	|SELECT
	|	Жур.Date_Time_IDDoc as Позиция
	|,	COALESCE(uchastniki.Участники,'') as Участники
	|FROM _1SJourn as Жур (nolock)
	|LEFT JOIN (SELECT
	|		(CASE it2 WHEN '' THEN it1
	|			ELSE CASE it3 WHEN '' THEN it1 + ', ' + it2
	|			ELSE CASE it4 WHEN '' THEN it1 + ', ' + it2 + ', ' + it3
	|			ELSE CASE it5 WHEN '' THEN it1 + ', ' + it2 + ', ' + it3 + ', ' + it4
	|			ELSE CASE it6 WHEN '' THEN it1 + ', ' + it2 + ', ' + it3 + ', ' + it4 + ', ' + it5
	|			ELSE it1 + ', ' + it2 + ', ' + it3 + ', ' + it4 + ', ' + it5 + ', ' + it6
	|		END END END END END) as Участники,
	|		grID as IDDOC
	|	 FROM (
	|		SELECT grID,
	|			MAX(CASE itNo WHEN 1 THEN rtrim(it) ELSE '' END) as it1,
	|			MAX(CASE itNo WHEN 2 THEN rtrim(it) ELSE '' END) as it2,
	|			MAX(CASE itNo WHEN 3 THEN rtrim(it) ELSE '' END) as it3,
	|			MAX(CASE itNo WHEN 4 THEN rtrim(it) ELSE '' END) as it4,
	|			MAX(CASE itNo WHEN 5 THEN rtrim(it) ELSE '' END) as it5,
	|			MAX(CASE itNo WHEN 6 THEN rtrim(it) ELSE '' END) as it6
	|		FROM (
	|			SELECT (
	|				select sum(1)
	|				FROM dt300 as ДокС2
	|				WHERE ДокС2.IDDOC = ДокС.IDDOC and ДокС2.sp308 <= ДокС.sp308
	|				) as itNo,
	|				ДокС.IDDOC as grID,
	|				спрСотр.Descr as it
	|			FROM dt300 as ДокС
	|			LEFT JOIN sc89 as спрСотр ON спрСотр.ID = ДокС.sp308
	|			) as OrderedItems
	|		GROUP BY grID
	|		) AS AlmostAggregated
	|	) as uchastniki ON uchastniki.IDDOC = Жур.IDDOC
	|WHERE Жур.IDDocDef = 300
 

  

Восторгаюсь 1С++ и классами к ней!
Наверх
ICQ  
IP записан
 
zk96
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 320
Местоположение: Киев
Зарегистрирован: 15. Ноября 2009
Пол: Мужской
Re: Собрать строки запроса в одну
Ответ #14 - 12. Октября 2011 :: 11:01
Печать  
Amel писал(а) 10. Октября 2011 :: 14:07:
Сразу вопрос, будет ли работать на скуле 2000?
...

В 2000 мой пример работать не будет. Я бы там делал через функцию.

Amel писал(а) 12. Октября 2011 :: 08:48:
Если кому интересно, нашел решение.
...

Твой метод работает быстро? Если да, то все прекрасно. Улыбка

Кстати, вот ссылочка. Посмотри.
http://www.sql.ru/faq/faq_topic.aspx?fid=130
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 
ОтправитьПечать