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

1. Сотр
ID (Primary key) (char 9) Descr (char 200)
' 3 ' Иванов И.А.
' 3D ' Сидоров П.А.

2. СтрокиДока
IDDOC (char 9) SotrID (ID из таблицы Сотр) (char 9)
' 9C ' ' 3 '
' 9C ' ' 3D '

3. Док
IDDOC (char 9) DOCNO (char 20)
' 9C ' '01234567890123456789'
' 9FA ' '01234567890000000001'



Нужно select'ом получить результат в виде:
DOCNO (char 20) Atts (varchar 500)
'01234567890123456789' Иванов И.А., Сидоров П.А.


Т.е. соединить в строку через запятую значения из колонки.
Гугление подсказывает только с использованием конструкций типа
@var = select....
Т.е. использование функций.
Мне это не подходит, поскольку я не могу использовать функции (нельзя на временных таблицах использовать).

Есть ли какие-то варианты реализации только на селектах?
Платформа: MS SQL 2000 Server SP3.
11 окт 11, 17:56    [11422313]     Ответить | Цитировать Сообщить модератору
 Re: Помощь в составлении запроса  [new]
Программист-Любитель
Member

Откуда:
Сообщений: 16839
См. ФАК по MS SQL серверу, там есть решение через ф-ию, не использующую временные таблицы.
11 окт 11, 18:16    [11422515]     Ответить | Цитировать Сообщить модератору
 Re: Помощь в составлении запроса  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
Amel2011
Есть ли какие-то варианты реализации только на селектах?
Платформа: MS SQL 2000 Server SP3.

Для этого сервера варианты ограничены... Если есть возможность перейти на >=2005, то можно будет через XML (как лучший вариант) или рекурсию (как еще один вариант).
11 окт 11, 18:21    [11422561]     Ответить | Цитировать Сообщить модератору
 Re: Помощь в составлении запроса  [new]
Amel2011
Guest
Вчера я нашел решение.
Вот такой примерно запрос:

|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

Т.е. ограничиваемся 6-ю сотрудниками. Мне подходит.
12 окт 11, 12:52    [11425974]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить