Имя: Пароль:
1C
1С v8
Хитро преобразовать таблицу
,
0 GomerSimpson
 
25.06.12
13:04
Есть таблица

Поставщик :          Документ :
Контрагент1          Поставка1
Контрагент1          Поставка2
Контрагент1          Оплата1
Контрагент1          Оплата2
Контрагент1          Оплата3

Хочется получить такую

Поставщик :          ДокПоставка :        ДокОплата :
Контрагент1          Поставка1            Оплата1
Контрагент1          Поставка2            Оплата2
Контрагент1                               Оплата3

Заранее спс.
1 vicof
 
25.06.12
13:10
Запросом получаешь данные из твоей ТЗ.
И два левых соединения первой таблицы с самой же собой.
2 Рэйв
 
25.06.12
13:15
(1)Имхо хватит одного
3 Ненавижу 1С
 
гуру
25.06.12
13:15
4 izekia
 
25.06.12
13:15
(2) апиридил
5 Rovan
 
гуру
25.06.12
13:16
(+2) выборка по документам типа Поставка
и Полное соединение с выборкой по документам типа Оплата
6 GomerSimpson
 
25.06.12
13:44
В результате соединения первой таблицы с самой же собой получается

Поставщик :          ДокПоставка :        ДокОплата :
Контрагент1          Поставка1            Оплата1
Контрагент1          Поставка1            Оплата2
Контрагент1          Поставка1            Оплата3
Контрагент1          Поставка2            Оплата1
Контрагент1          Поставка2            Оплата2
Контрагент1          Поставка2            Оплата3

А надо бы вот так

Поставщик :          ДокПоставка :        ДокОплата :
Контрагент1          Поставка1            Оплата1
Контрагент1          Поставка2            Оплата2
Контрагент1                               Оплата3
7 izekia
 
25.06.12
16:24
(6) по ссылке сходи, или фифо не надо?
8 andrewks
 
25.06.12
16:27
(3) чё-то я там нифига не понял условие задачи
9 izekia
 
25.06.12
16:28
у меня была подобная задача, дали как тест на собеседовании, контора компьютерами торгует?
запросом не решается
10 Ненавижу 1С
 
гуру
25.06.12
16:29
(8) разнести в запросе оплаты по реализациям, тат наоборот, но суть
11 Ненавижу 1С
 
гуру
25.06.12
16:29
(9) чей-то не решается?
12 Ненавижу 1С
 
гуру
25.06.12
16:29
+(11) хотя что имел ввиду автор
13 andrewks
 
25.06.12
16:31
(10) словами понял, просто таблицы в примере там вообще непонятные какие-то
14 izekia
 
25.06.12
16:31
(11) я про задачу где есть две таблицы с общим полем и различными значениями в определенном порядке
типа:

1 1
1 2
2 1

и
1 5
2 3
2 4

и необходимо сделать что-то вроде:
1 1 5
1 2
2 1 3
2   4
15 andrewks
 
25.06.12
16:42
(14) почему нельзя?
16 izekia
 
25.06.12
17:07
(15) текст запроса в студию)
17 Eugene_life
 
25.06.12
17:11
(16) пошел за попкорном
18 izekia
 
25.06.12
17:18
без попкорна запросы не пишутся?)
19 Eugene_life
 
25.06.12
17:19
(18) Я не умею писать запросы. Зато знаю, где лежит попкорн :)
20 Ненавижу 1С
 
гуру
25.06.12
17:21
(14) а почему так

1 1 5
1 2
2 1 3
2   4

а не

1 1
1 2 5
2 1 3
2   4
21 Ненавижу 1С
 
гуру
25.06.12
17:21
+(20) в (14) нужна нормальная постановка задачи
22 andrewks
 
25.06.12
17:22
(16) с тебя точная формулировка и что ставишь на кон
23 izekia
 
25.06.12
17:23
ну я думал вы все поняли
в первой колонке ид, то есть значения общего поля для обоих таблиц
во второй второе поле из первой таблицы, в третьей второе поле из второй таблицы
правила, по которым создается таблица, я решил описать наглядно
24 izekia
 
25.06.12
17:24
обеих таблиц*
25 Ненавижу 1С
 
гуру
25.06.12
17:24
(23) "я решил описать наглядно"
пока не вышло )))
26 izekia
 
25.06.12
17:37
в общем расположение такое:
в первой колонке идентификатор в следующих значения из соответствующих таблиц, соответствующие этому идентификатору
получается количество строк с идентификатором равно максимальному числу вхождения идентификатора в таблицу среди всех таблиц
значения располагаются в порядке возрастания, если количество значений меньше количества строк, то следующие за последним значением строки заполняются нуллом

так понятнее?
27 izekia
 
25.06.12
17:37
и мне кажется автор это и имел в виду
28 andrewks
 
25.06.12
18:16
(26) сделал
29 timurhv
 
25.06.12
18:22
Оплата и поставка связаны с помощью договора, а не контрагента, не? :)
30 izekia
 
25.06.12
19:19
(28) сам или запросом?)
31 andrewks
 
25.06.12
20:40
(30) сам. запросом :)
32 alexhtn
 
25.06.12
23:02
Длинновато, но работает
ВЫБРАТЬ
   ВложенныйЗапрос.Ссылка,
   СУММА(ВложенныйЗапрос.НомерСтроки) КАК НомерСтроки
ПОМЕСТИТЬ Таблица1
ИЗ
   (ВЫБРАТЬ
       Основная.Ссылка КАК Ссылка,
       1 КАК НомерСтроки,
       Вспомогательная.Ссылка КАК ВспомогательнаяСсылка
   ИЗ
       Справочник.Справочник1 КАК Основная
           ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Справочник1 КАК Вспомогательная
           ПО Основная.Ссылка >= Вспомогательная.Ссылка) КАК ВложенныйЗапрос

СГРУППИРОВАТЬ ПО
   ВложенныйЗапрос.Ссылка
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   ВложенныйЗапрос.Ссылка,
   СУММА(ВложенныйЗапрос.НомерСтроки) КАК НомерСтроки
ПОМЕСТИТЬ Таблица2
ИЗ
   (ВЫБРАТЬ
       Основная.Ссылка КАК Ссылка,
       1 КАК НомерСтроки,
       Вспомогательная.Ссылка КАК ВспомогательнаяСсылка
   ИЗ
       Справочник.Справочник2 КАК Основная
           ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Справочник2 КАК Вспомогательная
           ПО Основная.Ссылка >= Вспомогательная.Ссылка) КАК ВложенныйЗапрос

СГРУППИРОВАТЬ ПО
   ВложенныйЗапрос.Ссылка
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   ВложенныйЗапрос.Ссылка,
   СУММА(ВложенныйЗапрос.НомерСтроки) КАК НомерСтроки
ПОМЕСТИТЬ Таблица3
ИЗ
   (ВЫБРАТЬ
       Основная.Ссылка КАК Ссылка,
       1 КАК НомерСтроки,
       Вспомогательная.Ссылка КАК ВспомогательнаяСсылка
   ИЗ
       Справочник.Справочник3 КАК Основная
           ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Справочник3 КАК Вспомогательная
           ПО Основная.Ссылка >= Вспомогательная.Ссылка) КАК ВложенныйЗапрос

СГРУППИРОВАТЬ ПО
   ВложенныйЗапрос.Ссылка
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   Таблица1.Ссылка КАК Ссылка1,
   ВложенныйЗапрос.Ссылка2,
   ВложенныйЗапрос.Ссылка3
ИЗ
   Таблица1 КАК Таблица1
       ПОЛНОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
           Таблица2.Ссылка КАК Ссылка2,
           Таблица3.Ссылка КАК Ссылка3,
           ЕСТЬNULL(Таблица2.НомерСтроки, Таблица3.НомерСтроки) КАК НомерСтроки
       ИЗ
           Таблица2 КАК Таблица2
               ПОЛНОЕ СОЕДИНЕНИЕ Таблица3 КАК Таблица3
               ПО Таблица2.НомерСтроки = Таблица3.НомерСтроки) КАК ВложенныйЗапрос
       ПО Таблица1.НомерСтроки = ВложенныйЗапрос.НомерСтроки
33 rs_trade
 
25.06.12
23:42
по моему достаточно в селекте пары кейсов
34 rs_trade
 
25.06.12
23:43
а нет. вру. ))
35 andrewks
 
25.06.12
23:47
(34) да не, не врёшь. если не считать нумерации, то так и есть


select
1 as Поле1  // общее
,1 as Поле2
into
ВремТаб1
union
select 1, 2
union
select 2, 1

;

select
1 as Поле1  // общее
,5 as Поле3
into
ВремТаб2
union
select 2, 3
union
select 2, 4

;

select
ВремТаб1.Поле1 as Поле1
,ВремТаб1.Поле2 as Поле2
,count(ВремТаб2.Поле2) as НомерСтроки
into
ВремТаб1Нумер
from
ВремТаб1 as ВремТаб1
inner join
ВремТаб1 as ВремТаб2
on (ВремТаб1.Поле1=ВремТаб2.Поле1) and (ВремТаб1.Поле2>=ВремТаб2.Поле2)
group by
ВремТаб1.Поле1
,ВремТаб1.Поле2
index by
НомерСтроки

;

select
ВремТаб1.Поле1 as Поле1
,ВремТаб1.Поле3 as Поле3
,count(ВремТаб2.Поле3) as НомерСтроки
into
ВремТаб2Нумер
from
ВремТаб2 as ВремТаб1
inner join
ВремТаб2 as ВремТаб2
on (ВремТаб1.Поле1=ВремТаб2.Поле1) and (ВремТаб1.Поле3>=ВремТаб2.Поле3)
group by
ВремТаб1.Поле1
,ВремТаб1.Поле3
index by
НомерСтроки

;

select
isnull(ВремТаб1.Поле1,ВремТаб2.Поле1) as Поле1
,case when ВремТаб1.Поле1 is not null then ВремТаб1.Поле2 else NULL end as Поле2
,case when ВремТаб2.Поле1 is not null then ВремТаб2.Поле3 else NULL end as Поле3
from
ВремТаб1Нумер as ВремТаб1
full join
ВремТаб2Нумер as ВремТаб2
on (ВремТаб1.Поле1=ВремТаб2.Поле1) and (ВремТаб1.НомерСтроки=ВремТаб2.НомерСтроки)
order by
Поле1
,isnull(ВремТаб1.НомерСтроки,ВремТаб2.НомерСтроки)


36 GomerSimpson
 
26.06.12
10:29
(32)(35) спс, то что надо
37 izekia
 
26.06.12
12:02
(32) да, это то что нужно для автора, а я к сожалению, сам условие не совсем корректно сформировал