Имя: Пароль:
1C
 
Получить в результате запроса список цифр от 1 до к
0 FarFar
 
08.11.06
17:05
Доброе время суток!
Конкурс:
Мне необходим был запрос, выдающий список цифр от 1 до к(параметр). Сейчас я выбираю из справочника "Города" (УТ) коды городов. А есть ли более простой, изящный способ?
Заранее спасибо, FarFar
1 Salvador Limones
 
08.11.06
17:07
Каша какая-то! Цифры и коды городов!
2 FarFar
 
08.11.06
17:08
код города - имеет тип число. Поэтому всё работает. Умный Salvador - подскажи, как по другому...
3 FarFar
 
08.11.06
17:09
P.S. коды - не телефонные, а порядковые, которые автонумерацией задаются
4 Terv
 
08.11.06
17:13
зачем запросом?
5 FarFar
 
08.11.06
17:15
(4) Потому что это подзапрос в сложном запросе
6 Terv
 
08.11.06
17:18
кросс-отчет?
7 Scooter
 
08.11.06
17:19
вот для дат

   Запрос = Новый Запрос;
   Запрос.Текст =
   "ВЫБРАТЬ
   |    1 КАК Флаг,
   |    &ДатаСоздания КАК ДатаСоздания
   |
   |ИТОГИ ПО
   |    ДатаСоздания ПЕРИОДАМИ(МЕСЯЦ, &ДатаС, &ДатаПО)";
   
   Запрос.Текст = СтрЗаменить(Запрос.Текст, "(МЕСЯЦ,", "(" + ТипГруппировкиКолонок + ",");
   
   Запрос.УстановитьПараметр("ДатаСоздания",    Дата("00010101"));
   Запрос.УстановитьПараметр("ДатаС",    ДатаС);
   Запрос.УстановитьПараметр("ДатаПО",    ДатаПО);

   ВыборкаПериод = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам, "ДатаСоздания", "ВСЕ");
8 asady
 
08.11.06
17:20
(0)
вот таким запросом
по мотивам идеи (с)megalodon

SELECT
(a3.id + a2.id + a1.id + a0.id) КАК Числа

FROM
(
SELECT 1 id UNION ALL
SELECT 2 UNION ALL
SELECT 3 UNION ALL
SELECT 4 UNION ALL
SELECT 5 UNION ALL
SELECT 6 UNION ALL
SELECT 7 UNION ALL
SELECT 8 UNION ALL
SELECT 9
) as a0
INNER JOIN
(
SELECT 0 id UNION ALL
SELECT 10 UNION ALL
SELECT 20 UNION ALL
SELECT 30 UNION ALL
SELECT 40 UNION ALL
SELECT 50 UNION ALL
SELECT 60 UNION ALL
SELECT 70 UNION ALL
SELECT 80 UNION ALL
SELECT 90
) as a1 ON TRUE
INNER JOIN
(
SELECT 0 id UNION ALL
SELECT 100 UNION ALL
SELECT 200 UNION ALL
SELECT 300 UNION ALL
SELECT 400 UNION ALL
SELECT 500 UNION ALL
SELECT 600 UNION ALL
SELECT 700 UNION ALL
SELECT 800 UNION ALL
SELECT 900
) as a2 ON TRUE
INNER JOIN
(
SELECT 0 id UNION ALL
SELECT 1000 UNION ALL
SELECT 2000 UNION ALL
SELECT 3000 UNION ALL
SELECT 4000 UNION ALL
SELECT 5000 UNION ALL
SELECT 6000 UNION ALL
SELECT 7000 UNION ALL
SELECT 8000 UNION ALL
SELECT 9000
) as a3 ON TRUE
ORDER BY Числа
9 FarFar
 
08.11.06
17:22
(6) Углубляюсь в корни, это отчет, анализирующий обороты за периоды, длиной в N дней. Поэтому я группирую по "ПериодС", где ПериодС - определяю так:
ВЫБРАТЬ
           Города.Код КАК НомерПериода,
           НАЧАЛОПЕРИОДА(ДОБАВИТЬКДАТЕ(&текМомент, ДЕНЬ, -7 * Города.Код + 1), ДЕНЬ) КАК ПериодС,
           КОНЕЦПЕРИОДА(ДОБАВИТЬКДАТЕ(&текМомент, ДЕНЬ, -7 * (Города.Код - 1)), ДЕНЬ) КАК ПериодПо
       ИЗ
           Справочник.Города КАК Города
       ГДЕ
           Города.Код <= &КоличествоПериодов
10 FarFar
 
08.11.06
17:23
P.S. В данном случае N = 7
11 Neco
 
08.11.06
17:23
(7)В подзапросе не использовать
12 FarFar
 
08.11.06
17:24
(7), (11) ясен пень ,в подзапросе не использовать . Там же ИТОГИ. А мне надо использовать
13 Scooter
 
08.11.06
17:26
"список цифр от 1 до К" К - насколько большое значение может принимать?
14 FarFar
 
08.11.06
17:26
(8) 8-(((
15 FarFar
 
08.11.06
17:27
(13) к - ну, пусть до 1000
16 asady
 
08.11.06
17:28
(14) для семи будет вообще смешно:

SELECT
a0.id КАК Числа

FROM
(
SELECT 1 id UNION ALL
SELECT 2 UNION ALL
SELECT 3 UNION ALL
SELECT 4 UNION ALL
SELECT 5 UNION ALL
SELECT 6 UNION ALL
SELECT 7
) as a0
ORDER BY Числа
17 Neco
 
08.11.06
17:28
"периоды, длиной в N дней" - значит есть привязка к календарю?
18 Scooter
 
08.11.06
17:29
(13)если не большое тогда какнибудь так
ВЫБРАТЬ
 1
ОБЪЕДИНИТЬ
 2
ОБЪЕДИНИТЬ
 3
ОБЪЕДИНИТЬ
 4
ОБЪЕДИНИТЬ
 5
.....
19 FarFar
 
08.11.06
17:30
(16) Asady, ты не понял. 7 - это N(длина периода), а не К(количество периодов). К - может быть, например, 200. То есть хотят посмотреть обороты по 200 периодам, каждый по неделе. СРАЗУ ГОВОРЮ: не предлагать использовать период = неделя. N может быть любым.
20 FarFar
 
08.11.06
17:30
(17) читай (19)
21 Neco
 
08.11.06
17:32
(20) Прочел ;-)
Как вариант создать регистр сведений в котором заполнить списком периодов. Т.е. например измерение регистра Дата и заполнить его списком дат, которое потом использовать в запросе.
22 asady
 
08.11.06
17:35
(19)
с периодом говоришь.
может так:

SELECT
(a0.id*&Период) КАК Числа

FROM
(
SELECT 1 id UNION ALL
SELECT 2 UNION ALL
SELECT 3 UNION ALL
SELECT 4 UNION ALL
SELECT 5 UNION ALL
SELECT 6 UNION ALL
SELECT 7
) as a0
ORDER BY Числа
23 FarFar
 
08.11.06
17:35
(21) Мне это тоже приходило в голову. Поэтому и спросил у МИСТЫ, а как, если не откапывать стюардессу (то есть без извратов) -)))
24 asady
 
08.11.06
17:37
(22) получим при Период=7
набор чисел
Числа
7
14
21
28
35
42
49
25 pajaro
 
08.11.06
17:39
(0)так текст из (8), только формировать текст динамически, в зависимости от верхнего предела
26 FarFar
 
08.11.06
17:41
(22), (25) Что ж, такой вариант работает, и по производительности явно лучше, чем мой с обращением к базе.
А ЕЩЕ ПРОЩЕ ? Без запроса из 1000 юнионов, с текстом ,формируемым динамически ???
27 FarFar
 
08.11.06
17:42
(18) - (26) насчет твоего варианта тоже. По сути, у тебя и Asady одно и то же
28 sergeante
 
08.11.06
17:42
щя прикиним... :)
29 Neco
 
08.11.06
17:42
(26) Ну нельзя в 8ке использовать курсоры нельзя ;-)
30 pajaro
 
08.11.06
17:44
(26)какие 1000?
юнионов будет 10*порядок числа.
то есть, даже если нужен миллион, то юнионов порядка 80.
31 pajaro
 
08.11.06
17:47
то есть, даже 70, а не 80
32 FarFar
 
08.11.06
17:52
(8), (31) Убедил! Считаю, что победил вариант Asady (8).
Есть несогласные?
33 asady
 
08.11.06
17:54
(32) это не совсем мой вариант -
я же писал в (8) по мотивам идеи (с)megalodon
34 FarFar
 
08.11.06
17:54
(33) Не знаю, что такое (кто такое) megalodon -((
35 FarFar
 
08.11.06
17:57
(33) Просвети!
36 AntonioS
 
08.11.06
18:03
мне кажется, для лучшей автоматизации можно подкорректировать вариант (8)
таким образом: все селекты выбирают числа от 0 до 9.
и соответственно итоговое число : a3.id * 1000 + a2.id * 100 + a1.id * 10 + a0.id
37 asady
 
08.11.06
18:07