![]() |
![]() |
![]() |
|
Запрос для отчета | ☑ | ||
---|---|---|---|---|
0
Никмейн
28.01.22
✎
11:38
|
Добрый день!!! помогите доработать запрос(примерно): Если я формирую отчет без фильтрации <на рассмотрении>, то он учитывает и все другие статусы, и считает время обработки, как и должно быть. Выбрал кандидата Бирюкову Анну, но если я формирую отчет с фильтром <на рассмотрении> Бирюкова снова вываливается в отчет, хотя уже не должна, т.к. по ней работа уже прошла (есть другой статус).
Т.е. он считает всех, у кого есть этот статус в принципе. А не тех, у кого такая последняя запись, я думаю еще одну связь надо, или не правильно думаю? ВЫБРАТЬ МАКСИМУМ(Рег.Период) КАК Период, Рег.ЗаявкаКандидата КАК Кандидат, Рег.Состояние КАК Состояние ПОМЕСТИТЬ ВТ_Кандидаты ИЗ РегистрСведений.ТекущаяРаботаПоЗаявкамКандидатов КАК Рег ГДЕ Рег.Период МЕЖДУ &ДатаНачало И &ДатаКонец И НЕ Рег.ЗаявкаКандидата.ПометкаУдаления СГРУППИРОВАТЬ ПО Рег.ЗаявкаКандидата, Рег.Состояние ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ таб.Период КАК ДатаОткрытия, таб.Кандидат, ЕСТЬNULL(таб.Состояние, таб2.Состояние) КАК Состояние, ЕСТЬNULL(таб2.Период, таб.Период) КАК ДатаПредыдущегоСтатуса, РАЗНОСТЬДАТ(ЕСТЬNULL(таб2.Период, таб.Период), таб.Период, СЕКУНДА) КАК СекундыВсего ПОМЕСТИТЬ ВТ_Сек ИЗ ВТ_Кандидаты КАК таб ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Кандидаты КАК таб2 ПО таб.Кандидат = таб2.Кандидат И таб.Период > таб2.Период ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Кандидаты КАК табНаРассмотрении ПО таб.Кандидат = табНаРассмотрении.Кандидат И (табНаРассмотрении.Состояние = &Статус) ГДЕ НЕ табНаРассмотрении.Кандидат ЕСТЬ NULL ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ МЕСЯЦ(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, ВТ_Сек.СекундыВсего)) - 1 КАК ЦелыхМесяцев, ДЕНЬ(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, ВТ_Сек.СекундыВсего)) - 1 КАК ЦелыхДней, ЧАС(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, ВТ_Сек.СекундыВсего)) КАК ЦелыхЧасов, МИНУТА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, ВТ_Сек.СекундыВсего)) КАК ЦелыхМинут, СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, ВТ_Сек.СекундыВсего)) КАК ЦелыхСекунд, ВТ_Сек.ДатаОткрытия, ВТ_Сек.Кандидат, ВТ_Сек.Состояние, ВТ_Сек.ДатаПредыдущегоСтатуса ИЗ ВТ_Сек КАК ВТ_Сек ГДЕ НЕ ВТ_Сек.Кандидат.ПометкаУдаления |
|||
1
Ёпрст
гуру
28.01.22
✎
11:57
|
(0)
ГДЕ НЕ табНаРассмотрении.Кандидат ЕСТЬ NULL вот это делает твой лефт джоин в иннер джоин и ...делайте выводы. |
|||
2
Ryzeman
28.01.22
✎
12:13
|
Делай отбор к итоговой таблице.
Но вообще я не понимаю как это может работать правильно. У тебя всего два статуса? А что если их будет три? Да и даже как есть допустим, у тебя записи в регистре Иванов 10.01 НаРассмотрении Петров 15.01 Рассмотрено Состояние разное, оно не сгруппируется, в ВТ_Сек оно попадёт как 10.01 Иванов НаРассмотрении 10.01 0 15.01 Петров Рассмотрено 15.01 0 И тут косяк: ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Кандидаты КАК таб2 ПО таб.Кандидат = таб2.Кандидат И таб.Период > таб2.Период Если разные кандидаты меняют статус, оно никогда не будет считаться предыдущим... Я бы сделал срез последних для того что б узнать текущий статус, сам регистр с АВТОНОМЕРЗАПИСИ() выкинул бы по ВТ за нужный период, а там уже по этому полю связал бы, что б узнать дату предыдущего изменения. |
|||
3
Никмейн
28.01.22
✎
12:16
|
АВТОНОМЕРЗАПИСИ() к сожалению нету в скд, у меня версия УПП 8.2
|
|||
4
Ёпрст
гуру
28.01.22
✎
12:22
|
(3) кто сказал , что нету ?
|
|||
5
Ёпрст
гуру
28.01.22
✎
12:22
|
а..8.2, ну да, там еще не было.
Но, перенумеровать записи можно и там |
|||
6
Никмейн
28.01.22
✎
12:25
|
(2) а как тогда в соединении правильно сделать?
|
|||
7
Никмейн
28.01.22
✎
12:26
|
(1) это условие убрать?
|
|||
8
Никмейн
28.01.22
✎
12:27
|
(1) это отбор убрать?
|
|||
9
Ryzeman
28.01.22
✎
12:32
|
(3) Пронумеровать можно через КОЛИЧЕСТВО(), сделав условие по дате и сгруппировав все остальные поля временной таблицы. Если данных много, это будет медленно, зато хоть правильно...
|
|||
10
Никмейн
28.01.22
✎
12:43
|
(9) можете примерно сказать как будет выглядеть запрос, я тут накидал:
ВЫБРАТЬ МАКСИМУМ(Рег.Период) КАК Период, Рег.ЗаявкаКандидата КАК Кандидат, Рег.Состояние КАК Состояние ПОМЕСТИТЬ ВТ_Кандидаты ИЗ РегистрСведений.ТекущаяРаботаПоЗаявкамКандидатов.СрезПоследних(, ) КАК Рег ГДЕ Рег.Период МЕЖДУ &ДатаНачало И &ДатаКонец И НЕ Рег.ЗаявкаКандидата.ПометкаУдаления СГРУППИРОВАТЬ ПО Рег.ЗаявкаКандидата, Рег.Состояние ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ таб.Период КАК ДатаОткрытия, таб.Кандидат, ЕСТЬNULL(таб.Состояние, таб2.Состояние) КАК Состояние, ЕСТЬNULL(таб2.Период, таб.Период) КАК ДатаПредыдущегоСтатуса, РАЗНОСТЬДАТ(ЕСТЬNULL(таб2.Период, таб.Период), таб.Период, СЕКУНДА) КАК СекундыВсего ПОМЕСТИТЬ ВТ_Сек ИЗ ВТ_Кандидаты КАК таб ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Кандидаты КАК таб2 ПО таб.Кандидат = таб2.Кандидат И таб.Период > таб2.Период ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Кандидаты КАК табНаРассмотрении ПО таб.Кандидат = табНаРассмотрении.Кандидат И (табНаРассмотрении.Состояние = &Статус) //ГДЕ //НЕ табНаРассмотрении.Кандидат ЕСТЬ NULL СГРУППИРОВАТЬ ПО таб.Период, таб.Кандидат, ЕСТЬNULL(таб.Состояние, таб2.Состояние), ЕСТЬNULL(таб2.Период, таб.Период), РАЗНОСТЬДАТ(ЕСТЬNULL(таб2.Период, таб.Период), таб.Период, СЕКУНДА) ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ МЕСЯЦ(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, ВТ_Сек.СекундыВсего)) - 1 КАК ЦелыхМесяцев, ДЕНЬ(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, ВТ_Сек.СекундыВсего)) - 1 КАК ЦелыхДней, ЧАС(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, ВТ_Сек.СекундыВсего)) КАК ЦелыхЧасов, МИНУТА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, ВТ_Сек.СекундыВсего)) КАК ЦелыхМинут, СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, ВТ_Сек.СекундыВсего)) КАК ЦелыхСекунд, ВТ_Сек.ДатаОткрытия, ВТ_Сек.Кандидат, ВТ_Сек.Состояние, ВТ_Сек.ДатаПредыдущегоСтатуса ИЗ ВТ_Сек КАК ВТ_Сек ГДЕ НЕ ВТ_Сек.Кандидат.ПометкаУдаления ччто-то не то? |
|||
11
Ryzeman
28.01.22
✎
13:14
|
(10) Начнём с 1.
Ну и если сюда попадают помеченные на удаление ЗаявкаКандидата то это тоже некорректно. ВЫБРАТЬ Рег.Период КАК Период, Рег.ЗаявкаКандидата КАК Кандидат, Рег.Состояние КАК Состояние ПОМЕСТИТЬ ВТ_ТекущийСтатус ИЗ РегистрСведений.ТекущаяРаботаПоЗаявкамКандидатов.СрезПоследних(&ДатаКонец) КАК Рег Затем ВЫБРАТЬ Рег.Период КАК Период, Рег.ЗаявкаКандидата КАК ЗаявкаКандидата ПОМЕСТИТЬ ВТ_ВыборкаПоДатамИзменения ИЗ РегистрСведений.ТекущаяРаботаПоЗаявкамКандидатов КАК Рег ГДЕ Рег.Период МЕЖДУ &ДатаНачало И &ДатаКонец ; ВЫБРАТЬ КОЛИЧЕСТВО( РАЗЛИЧНЫЕ ТаблицаДляСвязи.ЗаявкаКандидата) КАК Номер, Таблица.Период, Таблица.ЗаявкаКандидата ИЗ ВТ_ВыборкаПоДатамИзменения КАК Таблица ЛЕВОЕ СОЕДИНЕНИЕ ВТ_ВыборкаПоДатамИзменения КАК ТаблицаДляСвязи ПО Таблица.ЗаявкаКандидата = ТаблицаДляСвязи.ЗаявкаКандидата И Таблица.Период >= ТаблицаДляСвязи.Период СГРУППИРОВАТЬ ПО Таблица.Период Таблица.ЗаявкаКандидата ; УНИЧТОЖИТЬ ВТ_ВыборкаПоДатамИзменения ; ВЫБРАТЬ ЛеваяТаблица.ЗаявкаКандидата КАК ЗаявкаКандидата, ЛеваяТаблица.Период КАК ДатаПоследнегоСтатуса, ЕСТЬNULL(ПраваяТаблица.Период, ЛеваяТаблица.Период) КАК ДатаПредыдущегоСтатуса, РАЗНОСТЬДАТ(ЕСТЬNULL(ПраваяТаблица.Период, ЛеваяТаблица.Период), ЛеваяТаблица.Период) КАК СекундыВсего ИЗ ВТ_ВыборкаПоДатамИзменения КАК ЛеваяТаблица ЛЕВОЕ СОЕДИНЕНИЕ ВТ_ВыборкаПоДатамИзменения КАК ПраваяТаблица ПО ЛеваяТаблица.ЗаявкаКандидата = ПраваяТаблица.ЗаявкаКандидата И ЛеваяТаблица.Номер = ПраваяТаблица.Номер + 1 Могут быть ошибки и неточности, естественно я это не отлаживал, дальше думай сам :) |
|||
12
Никмейн
28.01.22
✎
13:49
|
(11) спасибо
|
|||
13
Никмейн
31.01.22
✎
09:59
|
(11) ошибка пишет в строчке, что типа нету Номера
И ЛеваяТаблица.Номер = ПраваяТаблица.Номер + 1 |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |