|
Запрос - как правильней сделать? | ☑ | ||
---|---|---|---|---|
0
Gangar
27.03.15
✎
12:43
|
Доброго дня, уважаемые.
Есть задачка такая: два оборотных регистра План и Факт, измерения у них идентичные. Надо получить на выходе таблицу с Дата1 по Дата2 таким образом, что б в ней, при отсутствии движений по регистрам, поля заполнялись 0. Пробовал вложенный запрос, с соединениями, с виртуальной таблицей - в таблицу попадают только периоды, по которым есть движения. Подскажите, как быть? |
|||
1
alex_shkut
27.03.15
✎
12:48
|
Угадай с одного раза - почему тебя игнорят?
Книга знаний: Срез последних на каждую дату в запросе |
|||
2
Gangar
27.03.15
✎
12:52
|
(1) казалось бы - при чем тут СрезПоследних() и Регистр сведений?
|
|||
3
smitru
27.03.15
✎
12:52
|
(0)" что б в ней, при отсутствии движений по регистрам, поля заполнялись 0. "
IsNull(Сумма,0) - тебе в помощь |
|||
4
Gangar
27.03.15
✎
12:54
|
(3) как это поможет, когда за период не было никаких движений?
|
|||
5
palpetrovich
27.03.15
✎
12:57
|
че тут думать, выборка по дням из периода, в ней запрос :)
|
|||
6
Gangar
27.03.15
✎
12:58
|
(5) Запрос в цикле?!
|
|||
7
Ненавижу 1С
гуру
27.03.15
✎
12:58
|
я бы предложил объединение во временной таблице, а потом ее сгруппировать
работает быстрее чем полное соединение |
|||
8
palpetrovich
27.03.15
✎
12:59
|
(6) канешн :)
|
|||
9
Gangar
27.03.15
✎
13:00
|
(7) Во временной таблице беда с ИТОГИ ПО .. ПЕРИОДАМИ
(8) А вы знаете толк :) |
|||
10
palpetrovich
27.03.15
✎
13:04
|
(9) пятницо :)
|
|||
11
palpetrovich
27.03.15
✎
13:07
|
(9) скачай отсюда http://devtrainingforum.v8.1c.ru/forum/thread.jsp?id=602811 - ОстаткиПоДням.erf
там можно подсмотреть как в запросе организовать таллицу дат, к которой потом прикрутить остатки |
|||
12
smitru
27.03.15
✎
13:09
|
(4) "как это поможет, когда за период не было никаких движений?"
Только это и спасает. Так как движений нет, то результат - NULL, а чтобы преобразовать NULL в "ноль" и используется функция ISNULL(Поле1,0) ПыСы.. Только нужно при этом регистр остатков в соединении с другой таблицей с "левым соединением" (или с правым, в зависимости от написания запроса) |
|||
13
anaed
27.03.15
✎
13:09
|
(0)
1) строишь таблицу дат 2) объединяешь полным соединением или как в (7) указано свои план и факт 3) соединяешь таблицу дат с объединенной таблицей план/факта 4) не забываешь естьnull'ить |
|||
14
smitru
27.03.15
✎
13:20
|
(13) "объединяешь полным соединением "
С дуба рухнул такие советы давать? |
|||
15
Gangar
27.03.15
✎
15:06
|
что-то не выходит каменный цветок...
смотрю в конфигураторе и консоли - отдельно периоды и отдельно данные |
|||
16
smitru
27.03.15
✎
15:27
|
(15) Тебе уже сказали.
1. Получи отдельно таблицу с датами и запихни её во временную таблицу (но это не тривиальная задачка, нужны навыка проганья на сиквеле) 2. Вяжешь левым соединением эту таблицу с датами с оборотным регистром, где сумму регистра запихиваешь в функцию isnull 3. Группируешь полученный запрос по датам, а поле сумм - суммируешь. ПыСы.. Только не забудь, чтобы "приход" у тебя был с плюсом, а "расход" с минусом перед суммированием |
|||
17
Gangar
27.03.15
✎
17:39
|
Всем спасибо, все получилось.
Для упрощения получения даты взял РАЗЛИЧНЫЕ ПЕРИОД из оборотного регистра, в котором движения есть каждый день. |
|||
18
palpetrovich
27.03.15
✎
17:56
|
(17) хе, а вдруг завтра не будтет там движения?
и че, код из (11) такой уж трудный? :) ВЫБРАТЬ ДОБАВИТЬКДАТЕ(&НачалоПериода, ДЕНЬ, aa.a * 1000 + bb.b * 100 + cc.c * 10 + dd.d) КАК Период {ВЫБРАТЬ Период} ИЗ (ВЫБРАТЬ 0 КАК a ОБЪЕДИНИТЬ ВЫБРАТЬ 1 ОБЪЕДИНИТЬ ВЫБРАТЬ 2 ОБЪЕДИНИТЬ ВЫБРАТЬ 3 ОБЪЕДИНИТЬ ВЫБРАТЬ 4 ОБЪЕДИНИТЬ ВЫБРАТЬ 5 ОБЪЕДИНИТЬ ВЫБРАТЬ 6 ОБЪЕДИНИТЬ ВЫБРАТЬ 7 ОБЪЕДИНИТЬ ВЫБРАТЬ 8 ОБЪЕДИНИТЬ ВЫБРАТЬ 9) КАК aa ПОЛНОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ 0 КАК b ОБЪЕДИНИТЬ ВЫБРАТЬ 1 ОБЪЕДИНИТЬ ВЫБРАТЬ 2 ОБЪЕДИНИТЬ ВЫБРАТЬ 3 ОБЪЕДИНИТЬ ВЫБРАТЬ 4 ОБЪЕДИНИТЬ ВЫБРАТЬ 5 ОБЪЕДИНИТЬ ВЫБРАТЬ 6 ОБЪЕДИНИТЬ ВЫБРАТЬ 7 ОБЪЕДИНИТЬ ВЫБРАТЬ 8 ОБЪЕДИНИТЬ ВЫБРАТЬ 9) КАК bb ПО (ИСТИНА) ПОЛНОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ 0 КАК c ОБЪЕДИНИТЬ ВЫБРАТЬ 1 ОБЪЕДИНИТЬ ВЫБРАТЬ 2 ОБЪЕДИНИТЬ ВЫБРАТЬ 3 ОБЪЕДИНИТЬ ВЫБРАТЬ 4 ОБЪЕДИНИТЬ ВЫБРАТЬ 5 ОБЪЕДИНИТЬ ВЫБРАТЬ 6 ОБЪЕДИНИТЬ ВЫБРАТЬ 7 ОБЪЕДИНИТЬ ВЫБРАТЬ 8 ОБЪЕДИНИТЬ ВЫБРАТЬ 9) КАК cc ПО (ИСТИНА) ПОЛНОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ 0 КАК d ОБЪЕДИНИТЬ ВЫБРАТЬ 1 ОБЪЕДИНИТЬ ВЫБРАТЬ 2 ОБЪЕДИНИТЬ ВЫБРАТЬ 3 ОБЪЕДИНИТЬ ВЫБРАТЬ 4 ОБЪЕДИНИТЬ ВЫБРАТЬ 5 ОБЪЕДИНИТЬ ВЫБРАТЬ 6 ОБЪЕДИНИТЬ ВЫБРАТЬ 7 ОБЪЕДИНИТЬ ВЫБРАТЬ 8 ОБЪЕДИНИТЬ ВЫБРАТЬ 9) КАК dd ПО (ИСТИНА) ГДЕ aa.a * 1000 + bb.b * 100 + cc.c * 10 + dd.d <= РАЗНОСТЬДАТ(&НачалоПериода, &КонецПериода, ДЕНЬ) |
|||
19
fisher
27.03.15
✎
18:03
|
(18) Без временной таблицы - да. Гораздо внушительней выглядит.
|
|||
20
Drac0
27.03.15
✎
18:06
|
(0) Используй:
|ИТОГИ | МАКСИМУМ(Сумма) |ПО | Дата ПЕРИОДАМИ(ДЕНЬ, &Начало, &Конец), | Валюта Обходи правильно: пВыборкаДень= Запрос.Выполнить.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам, "Дата", "Все") |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |