Имя: Пароль:
1C
1С v8
Помогите с SQL-запросом
0 jk3
 
29.07.11
16:47
Есть простая табличка из 2-х колонок и 3 строк (к примеру):

Номенклатура  Количество
============  ==========
Лопата            6
Лом               3
Штык              1


Нужно преобразовать в такую табличку:

Номенклатура  Количество
============  ==========
Лопата            1
Лопата            1
Лопата            1
Лопата            1
Лопата            1
Лопата            1
Лом               1
Лом               1
Лом               1
Штык              1


Как это сделать SQL-запросом?
1 mpei
 
29.07.11
16:48
убери группировку по номенклатуре
2 jk3
 
29.07.11
16:49
(1) Её и нет
Считай 1-ю табличку просто исходной табличной частью дока.
3 ДенисЧ
 
29.07.11
16:49
курсором и временной таблицей
4 jk3
 
29.07.11
16:50
(3) Понятно что с помощью временной таблицы, но КАК?
5 ДенисЧ
 
29.07.11
16:52
(4) открываешь курсор на исходную таблицу, читаешь по записи и делаешь цикл по значению второй колонки. В цикле инсёртишь в табличку
6 acsent
 
29.07.11
16:52
(4) ЗАЧЕМ?????
7 jk3
 
29.07.11
16:53
(6) Не мои прихоти. Надо чтобы так было.
8 jk3
 
29.07.11
16:54
(5) Ага, а перерь тоже самое, но на 1С v8, плиз :)
9 ДенисЧ
 
29.07.11
16:57
(8) ты просил на скуле :-)
Если с 8кой - то проще, не надо думать, что такое курсор
10 Axel2009
 
29.07.11
16:59
ВЫБРАТЬ Номенклатура, 1 ИЗ Таблица ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ 1 КАК Счетчик ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 2 КАК Счетчик ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 3 КАК Счетчик ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 4 КАК Счетчик ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 5 КАК Счетчик ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 6 КАК Счетчик) КАК Номера
ПО Таблица.Количество < Номера.Счетчик
11 Axel2009
 
29.07.11
17:00
ПО Таблица.Количество <= Номера.Счетчик
12 jk3
 
29.07.11
17:05
(10) Это не интересно вообще. Нужно для произвольного поля Количество.
Для статического количества я бы и так давно написал бы.
13 Axel2009
 
29.07.11
17:06
(12) догадайся что надо сделать.
14 jk3
 
29.07.11
17:07
(13) А БЕЗ генерации кода SQL-запроса в цикле?
15 Reset
 
29.07.11
17:10
Получи максимальное значение количества,сформируй ТЗ, состоящую из строк со значениями 1 по макс, передай эту тз как параметр, соедини со своей по принципу из (10)
Текст запроса будет фиксированный)
16 Ненавижу 1С
 
гуру
29.07.11
17:10
(14) БЕЗ нельзя
17 Axel2009
 
29.07.11
17:15
(14) это неправильная догадка. генерацию кода в скуль запросе делать не надо. нужно или гдето хранить заведомо большое количество записей с номерами (в табличке) что наиболее предпочтительно. или сформировать заведомо большую табличку, только не так
ВЫБРАТЬ 1 КАК Счетчик ... ВЫБРАТЬ МИЛЛИОН как Счетчик
а
ВЫБРАТЬ Табл1.Счетчик * 2 + Табл2.Счетчик КАК Счетчик
ИЗ (ВЫБРАТЬ 0 КАК Счетчик ОБЪЕДИНИТЬ ВЫБРАТЬ 1) КАК Табл1, (ВЫБРАТЬ 0 КАК Счетчик ОБЪЕДИНИТЬ ВЫБРАТЬ 1) КАК Табл2
тут если сделать от 0 до 9 и сбацать из 6 таких, то количество будет до мильена
18 cViper
 
29.07.11
17:18
(8) Курсор в переводе на язык 1с 8  - выборка.
19 cViper
 
29.07.11
17:23
+(18) да,(16) прав. ты так и не ответил, а зачем тебе это?
20 Axel2009
 
29.07.11
17:24
(19) нюню
21 jk3
 
29.07.11
17:25
(15) Нужно именно SQLем, т.к. это одна из вложенных выборок гигантского запроса. И данные в него получаются из другой временной таблицы.
(17) Сейчас попробую вкурить
22 jk3
 
29.07.11
19:10
Всё, довкурил.
Сделал только до 100. Я думаю этого будет достаточно.
Да и исполняться он будет значительно быстрее, чем до 1000.
Ведь если в таб.части будет 1000 строк, то в фильтруемой выборке уже будет 1 млн. записей. И это только по одному документу.

ВЫБРАТЬ
   Табл0_10.Счетчик
ПОМЕСТИТЬ ВТ
ИЗ
   (ВЫБРАТЬ
       0 КАК Счетчик
   
   ОБЪЕДИНИТЬ ВСЕ
   
   ВЫБРАТЬ
       1
   
   ОБЪЕДИНИТЬ ВСЕ
   
   ВЫБРАТЬ
       2
   
   ОБЪЕДИНИТЬ ВСЕ
   
   ВЫБРАТЬ
       3
   
   ОБЪЕДИНИТЬ ВСЕ
   
   ВЫБРАТЬ
       4
   
   ОБЪЕДИНИТЬ ВСЕ
   
   ВЫБРАТЬ
       5
   
   ОБЪЕДИНИТЬ ВСЕ
   
   ВЫБРАТЬ
       6
   
   ОБЪЕДИНИТЬ ВСЕ
   
   ВЫБРАТЬ
       7
   
   ОБЪЕДИНИТЬ ВСЕ
   
   ВЫБРАТЬ
       8
   
   ОБЪЕДИНИТЬ ВСЕ
   
   ВЫБРАТЬ
       9
   
   ОБЪЕДИНИТЬ ВСЕ
   
   ВЫБРАТЬ
       10) КАК Табл0_10
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗЛИЧНЫЕ
   ВТ4.Счетчик * 4 + ВТ3.Счетчик * 3 + ВТ2.Счетчик * 2 + ВТ.Счетчик КАК Счетчик
ПОМЕСТИТЬ ВТ100
ИЗ
   ВТ КАК ВТ,
   ВТ КАК ВТ2,
   ВТ КАК ВТ3,
   ВТ КАК ВТ4
;

//

ВЫБРАТЬ
   ПередачаОборудованияВМонтажОборудование.Номенклатура,
   ПередачаОборудованияВМонтажОборудование.Количество
ПОМЕСТИТЬ ВТТабЧасть
ИЗ
   Документ.ПередачаОборудованияВМонтаж.Оборудование КАК ПередачаОборудованияВМонтажОборудование
ГДЕ
   ПередачаОборудованияВМонтажОборудование.Ссылка = &Ссылка
;

//

ВЫБРАТЬ
   ТабЧасть.Номенклатура,
   1 КАК Поле1
ИЗ
   ВТТабЧасть КАК ТабЧасть
       ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ100 КАК Номера
       ПО ТабЧасть.Количество > Номера.Счетчик
23 Axel2009
 
31.07.11
11:38
неправильно довкурил.. до 100 так никто не делает..
ВЫБРАТЬ
   Табл0_9.Счетчик
ПОМЕСТИТЬ ВТ
ИЗ
   (ВЫБРАТЬ
       0 КАК Счетчик
   
   ОБЪЕДИНИТЬ ВСЕ
   
   ВЫБРАТЬ
       1
   
   ОБЪЕДИНИТЬ ВСЕ
   
   ВЫБРАТЬ
       2
   
   ОБЪЕДИНИТЬ ВСЕ
   
   ВЫБРАТЬ
       3
   
   ОБЪЕДИНИТЬ ВСЕ
   
   ВЫБРАТЬ
       4
   
   ОБЪЕДИНИТЬ ВСЕ
   
   ВЫБРАТЬ
       5
   
   ОБЪЕДИНИТЬ ВСЕ
   
   ВЫБРАТЬ
       6
   
   ОБЪЕДИНИТЬ ВСЕ
   
   ВЫБРАТЬ
       7
   
   ОБЪЕДИНИТЬ ВСЕ
   
   ВЫБРАТЬ
       8
   
   ОБЪЕДИНИТЬ ВСЕ
   
   ВЫБРАТЬ
       9) КАК Табл0_9
;

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ РАЗЛИЧНЫЕ
   ВТ2.Счетчик * 10 + ВТ.Счетчик + 1 КАК Счетчик
ПОМЕСТИТЬ ВТ100
ИЗ
   ВТ КАК ВТ,
   ВТ КАК ВТ2

будет от 1 до 100.
24 jk3
 
01.08.11
09:25
(23) Спасибо громадное за поправку!
Соответственно, до 1000 будет вот так:

ВЫБРАТЬ
   ВТ3.Счетчик * 100 + ВТ2.Счетчик * 10 + ВТ.Счетчик + 1 КАК Счетчик
ПОМЕСТИТЬ ВТ1000
ИЗ
   ВТ КАК ВТ,
   ВТ КАК ВТ2,
   ВТ КАК ВТ3

Принцип понятен :)