|
Вопрос по СКД | ☑ | ||
---|---|---|---|---|
0
anna_z
27.12.20
✎
17:06
|
Здравствуйте!
Есть регистр сведений, в нем определено измерение "Лицевой счет" и ресурс "Количество жителей". Нужно посчитать, как изменилось количество жителей на определенную дату. То есть взять число жителей из последней записи и вычесть число жителей из предпоследней. Как это сделать средствами СКД, не прибегая к функциям общих модулей? |
|||
1
МихаилМ
27.12.20
✎
17:27
|
регистр периодический ?
|
|||
2
anna_z
27.12.20
✎
17:29
|
Да, по позиции регистратора.
|
|||
3
rozer76
27.12.20
✎
17:54
|
Объединить два запроса среза на разные даты и вычесть значения
|
|||
4
Cthulhu
27.12.20
✎
18:04
|
(3) там наверное не так. судя по формулировкам - по каждому(!) лицевому счету надо сравнивать значение, установленное(!) по нему при(!) последний его установке со значением, установленным(!) по нему при(!) пред-последний его установке. а это не так просто (и самое главное - весьма затратный запрос получится если только в не это делать).
|
|||
5
anna_z
27.12.20
✎
18:06
|
(3) Даты записей различны. Так не получится получить последнюю и предпоследнюю запись.
Например, записи для ЛС1: 1.11 - 2 жильца; 10.11 - 3 жильца; 1.12 - 4 жильца; А для ЛС2: 1.11 - 1 жилец; 1.12 - 5 жильцов; Если мы возьмем срезы на 1.11 и 1.12, то получим разность для ЛС1: 4-2 = 2, что неверно. |
|||
6
Cthulhu
27.12.20
✎
18:14
|
|ВЫБРАТЬ ПЕРВЫЕ 2
|РсЛицевыеСчета.Период, |РсЛицевыеСчета.ЛицевойСчет, |РсЛицевыеСчета.КолчествоЖителей |ИЗ | РегистрСведений.ЛицевыеСчета КАК РсЛицевыеСчета |ГДЕ | РсЛицевыеСчета.Период МЕЖДУ &НачПериода И &КонПериода |УПОРЯДОЧИТЬ ПО | Период УБЫВ |
|||
7
Cthulhu
27.12.20
✎
18:15
|
в (4) про реурсоемкость - ошибка, перепутал с "на каждую дату" ))
|
|||
8
anna_z
27.12.20
✎
18:30
|
(6) Такой запрос возвращает первые 2 ЛС :-)
|
|||
9
Cthulhu
27.12.20
✎
18:51
|
(8): последние 2
в (0) "Нужно посчитать, как изменилось количество жителей на определенную дату" - в (6) оно и есть (с установкой параметра начпериода на "до рождества христова") |
|||
10
ам794123
27.12.20
✎
19:53
|
(0) первая временная таблица - срез последних. Вторая временная таблица - срез последних без учета данных первой временной таблицы. Ну и разница этих двух таблиц.
|
|||
11
kumena
27.12.20
✎
20:37
|
так должно работать
Выбрать Период ,ЛицевойСчет ,КоличествоЖителей Поместить Основная Из РегистрСведений.ЛицевыеСчета.СрезПоследних(&НужнаяДата) ; Выбрать ПредпоследнийСрез.ЛицевойСчет ,Счета.Период ,Счета.КоличествоЖителей Поместить ПредыдущиеЗаписи Из ( Выбрать Основная.Период ,Основная.ЛицевойСчет ,Максимум(Счета.Период) КАК ДатаСреза Из Основная КАК Основная Левое соединение РегистрСведений.ЛицевыеСчета КАК Счета По Основная.ЛицевойСчет = Счета.ЛицевойСчет и Основная.Период > Счета.Период Сгруппировать по Основная.Период ,Основная.ЛицевойСчет ) КАК ПредпоследнийСрез Левое соединение РегистрСведений.ЛицевыеСчета КАК Счета По Основная.ЛицевойСчет = Счета.ЛицевойСчет и Основная.ДатаСреза = Счета.Период ; Выбрать Основная.ЛицевойСчет ,Основная.КоличествоЖителей - ISNULL(ПредыдущиеЗаписи.КоличествоЖителей, 0) КАК Разница Из Основная КАК Основная Левое соединение ПредыдущиеЗаписи КАК ПредыдущиеЗаписи По Основная.ЛицевойСчет = ПредыдущиеЗаписи.ЛицевойСчет |
|||
12
D_E_S_131
28.12.20
✎
07:12
|
(11) Вот это ты накатал... :)
|
|||
13
toypaul
гуру
28.12.20
✎
09:28
|
Зависит от структуры отчета. Можно сделать без извратов с запросом
|
|||
14
anna_z
28.12.20
✎
16:43
|
(11) Здорово, конечно, - 2 временные таблицы. Но база очень большая, боюсь мой отчет будет весь день формироваться.))
Написала запрос, который выбирает все записи из регистра и упорядочивает по убыванию периода. Добавила вычисляемое поле "Изменение", выражение: isNULL(ВычислитьВыражение("КолвоЖителей", , , "Первая") - ВычислитьВыражение("КолвоЖителей", , , "Первая(2)"), 0) В настройках отчета группировки по Населенному пункту, ЛС и детальные записи. Выставила в "Других настройках" количество записей 2. По каждому ЛС изменение верно посчиталось, а вот итоги какие-то кривые. Даже не понятно как они получаются. Может, данные ЛС, у которые больше 2 записей тоже вошли в итоги? |
|||
15
toypaul
гуру
28.12.20
✎
18:44
|
(14) с итогам тут будет проблема. судя по выражению на группировках они должны считаться по детальным записям с отбором по значениям группировок, что понятно совсем не то что нужно.
с помощью Сумма не посчитаешь такое и с помощью ВычислитьВыражениеСГруппировкойМассив тоже потому что ВычислитьВыражение внутрих этих функций нельзя использовать. так что придется использовать запрос. или что сложнее 2 схемы СКД. в первой получать базовую таблицу с вычисленным выражением, а вторую с обычной Сумма |
|||
16
kumena
28.12.20
✎
18:56
|
> Вот это ты накатал... :)
легкая разминка на 5-7 минут! ))) > Можно сделать без извратов с запросом У меня другое мнение, извраты - это без запроса, т.к. на сегодняшний день запрос - это самый быстрый способ получения данных из базы. > Но база очень большая, боюсь мой отчет будет весь день формироваться.)) фройляйн, вы попробуйте, а потом уже мнение высказывайте. это не тяжелый запрос. |
|||
17
kumena
28.12.20
✎
18:56
|
В любом случае - всем удачи!
|
|||
18
МихаилМ
28.12.20
✎
19:46
|
(16) у "фройляйн" с мужским полом если не включено "разрешить итоги срез полследних" - то 2 скана (фул индекс - без разницы). иначе - 1. повод для увольнения из-за проф непригодности.
|
|||
19
ам794123
28.12.20
✎
19:51
|
(16) этот запрос на любой базе будет выполнятся секунды.
|
|||
20
Дык ё
28.12.20
✎
20:18
|
(14) соедини два запроса в одной схеме с передачей параметров в настройках соединения. а (15) не слушай, он щас насоветует.. :)
|
|||
21
Cthulhu
28.12.20
✎
20:47
|
бльо накатали.
еще раз. если нужны даты и значения двух последних установок - простенький запрос (6), если надо - от него полпинка до "разницы". и полтора - до сведЕния к по-датной "шахматке". ИЛИ ЧО НАДО??? |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |