![]() |
![]() |
![]() |
|
Сгруппировать записи в СКД особым способом. Можно ли? | ☑ | ||
---|---|---|---|---|
0
Alana_yar
27.01.16
✎
09:59
|
Добрый день!
есть исходная таблица в виде: Авто | Дата |Водитель| СпидометрНаНачало|СпидометрНаКонец __________________________________________________________ Авто1 |01.01.16|Иванов | 20 | 30 Авто1 |02.01.16|Иванов | 30 | 40 Авто1 |03.01.16|Иванов | 40 | 50 Авто1 |04.01.16|Петров | 50 | 60 Авто1 |05.01.16|Петров | 60 | 70 Авто1 |06.01.16|Иванов | 70 | 80 Авто1 |07.01.16|Иванов | 80 | 90 Хочу в СКД получить таблицу с группировкой по авто, а внутри этой группировки свернуть записи, следующим образом: Авто | Дата |Водитель| СпидометрНаНачало|СпидометрНаКонец __________________________________________________________ Авто1 | | | | Авто1 | |Иванов | 20 | 50 Авто1 | |Петров | 50 | 70 Авто1 | |Иванов | 70 | 90 Группировка по водителю не подходит, т.к. сворачивает все записи в одну. Возможно ли такое вообще сделать на СКД? |
|||
1
butterbean
27.01.16
✎
10:02
|
а в чем логика этого сворачивания? в смысле - по какому принципу свернуто?
|
|||
2
HardBall
27.01.16
✎
10:08
|
Нарастающий итог же!
|
|||
3
ГеннадийУО
27.01.16
✎
10:09
|
(0) Возможно.
|
|||
4
Alana_yar
27.01.16
✎
10:20
|
(2) (3) Можно поподробнее..., пожалуйста.
|
|||
5
Alana_yar
27.01.16
✎
10:22
|
(1) начальное показание - минимум среди подряд идущих записей с одинаковым водителем.
конечное показание - максимум по такому же принципу. |
|||
6
Alana_yar
27.01.16
✎
10:23
|
нарастающий итог, я думаю не подойдет, т.к. нужно еще и свернуть записи.
|
|||
7
ГеннадийУО
27.01.16
✎
10:23
|
(4) Гугли Нарастающий итог в СКД
|
|||
8
ГеннадийУО
27.01.16
✎
10:26
|
(6) Ну так сначала посчитай нарастающий итог, а потом сверни...
|
|||
9
Alana_yar
27.01.16
✎
10:32
|
(8) свернуть можно только группировкой по водителю, но тогда не будет записей вида
иванов | 20|50 петров | 50|70 иванов | 70|90 а будет иванов|20|90 петров|50|70 т.е. две строчки с одним водителем не получится... |
|||
10
ГеннадийУО
27.01.16
✎
10:36
|
(9) Тогда сначала получи из дат периоды по водителям, потом группируй по периоду и водителю...
|
|||
11
Alana_yar
27.01.16
✎
10:44
|
придется колдовать с запросом
|
|||
12
AceVi
27.01.16
✎
10:45
|
Просто поясним нам - иванов | 70|90 вот эта строка как у тебя получалась, покажи из каких строк и что ты там свернул - формулами. В изначальной таблице такой записи нет и как ты ее получил, непонятно.
Вообще в скд можно как угодно задать группировку через доп поле в запросе например, доп поле формируется на основе записей в текущей строке, и потом группируешь по этому полю. Так например расчетные ведомости по зарплате на скд делают. |
|||
13
Alana_yar
27.01.16
✎
10:50
|
(12) иванов| 70|90 получилось путем сворачивания 2х последних строк исходной таблицы по водителю. 70 - это минимум из этих двух строк, 90 - максимум
|
|||
14
AceVi
27.01.16
✎
11:13
|
В запросе ты так не сделаешь - тебе надо доп поле группировки - Советую сделать так. Запросом формируешь изначальную таблицу, затем дорабатываешь ее в цикле(т.е. тебе нужно отследить последовательности водителей и пронумеровать их т.е будет так.
Авто1 |01.01.16|Иванов | 20 | 30 |1 Авто1 |02.01.16|Иванов | 30 | 40 |1 Авто1 |03.01.16|Иванов | 40 | 50 |1 Авто1 |04.01.16|Петров | 50 | 60 |2 Авто1 |05.01.16|Петров | 60 | 70 |2 Авто1 |06.01.16|Иванов | 70 | 80 |3 Авто1 |07.01.16|Иванов | 80 | 90 |3 Потом гототвую таблицу помещаешь в СКД как внешние данные и делаешь группировку по доп полю. в запросе ты такое доп поле не сделаешь, только в цикле. |
|||
15
Alana_yar
27.01.16
✎
11:24
|
(14) Теоретически можно и в запросе, если соединить ее саму с собой по хитрому условию.
Про такой вариант тоже думала с доработкой в цикле. (на самом деле это самый запасной вариант)). Хочется именно средствами скд побороть проблему. А можно ли с помощью ВычислитьВыражение() сделать доп поле по такому принципу: если водитель текущей строки = водителю из предыдущей строки, то поле равно Дата из предыдущей строки, иначе Дата из текущей строки. И тогда уже можно будет по водителю и этому полю свернуть. Вопрос как в скд обратиться с данным предыдущей строки. |
|||
16
AceVi
27.01.16
✎
11:31
|
В запросах нельзя обращаться к следующей строке. Можно только пронумеровать строки, затем делать хитрое соединение ,например, по условию Таб.НомерСтроки=Таб.НомерСтроки+1 - так ты получишь данные из следующей строки в текущей строке. но и это тебе не поможет. тебе надо отследить именно последовательность которая может состоять из любого кол-ва строк, а в запросе ты можешь сравнить только определнное кол-во строк за раз.Т.е. можно задать сколько угодно раз соединение со смещением Таб.НомерСтроки=Таб.НомерСтроки+2(3,4,...), но что если последовательность будет из 10 подряд одинаковых фамилий? или из 20? в общем в цикле самое верное.
|
|||
17
ГеннадийУО
27.01.16
✎
11:36
|
(15) Показания спидометра всегда будут идти по возрастанию?
|
|||
18
Alana_yar
27.01.16
✎
11:47
|
(17) с условием сортировки по дате - да
|
|||
19
ГеннадийУО
27.01.16
✎
11:47
|
Про функции СКД например http://catalog.mista.ru/public/86764/
|
|||
20
zidane321
27.01.16
✎
11:55
|
Вам нужно соединить таблицу самой с собой, и там плясать, на бумаге меня получилось сейчас сделать ваше задание
|
|||
21
AceVi
27.01.16
✎
11:58
|
(20) ну ка покажи как ты сделал. ты мое описание читал в 16? сделать можно но никто не гарантирует что последовательность не станет больше.
|
|||
22
ГеннадийУО
27.01.16
✎
12:14
|
Вот както так:
ВЫБРАТЬ "Авто1" КАК Авто, "Иванов" КАК Водитель, ДАТАВРЕМЯ(2016, 1, 1) КАК Дата, 20 КАК СпидометрНаНачало, 30 КАК СпидометрНаКонец ПОМЕСТИТЬ Данные ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ "Авто1", "Иванов", ДАТАВРЕМЯ(2016, 1, 2), 30, 40 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ "Авто1", "Иванов", ДАТАВРЕМЯ(2016, 1, 3), 40, 50 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ "Авто1", "Петров", ДАТАВРЕМЯ(2016, 1, 4), 50, 60 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ "Авто1", "Петров", ДАТАВРЕМЯ(2016, 1, 5), 60, 70 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ "Авто1", "Иванов", ДАТАВРЕМЯ(2016, 1, 6), 70, 80 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ "Авто1", "Иванов", ДАТАВРЕМЯ(2016, 1, 7), 80, 90 ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ Данные.Дата КАК ДатаНачала, МИНИМУМ(СледующиеДанные.Дата) КАК ДатаОкончания, Данные.СпидометрНаНачало КАК СпидометрНаНачало, Данные.СпидометрНаКонец, Данные.Водитель, СледующиеДанные.Водитель КАК СледующийВодитель, Данные.Авто ПОМЕСТИТЬ ВТПериоды ИЗ Данные КАК Данные ЛЕВОЕ СОЕДИНЕНИЕ Данные КАК СледующиеДанные ПО Данные.Дата < СледующиеДанные.Дата И Данные.Водитель <> СледующиеДанные.Водитель СГРУППИРОВАТЬ ПО Данные.Дата, Данные.СпидометрНаНачало, Данные.Водитель, СледующиеДанные.Водитель, Данные.СпидометрНаКонец, Данные.Авто ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ВТПериоды.Авто, ВТПериоды.Водитель, МИНИМУМ(ВТПериоды.СпидометрНаНачало) КАК СпидометрНаНачало, МАКСИМУМ(ВТПериоды.СпидометрНаКонец) КАК СпидометрНаКонец ИЗ ВТПериоды КАК ВТПериоды СГРУППИРОВАТЬ ПО ВТПериоды.Водитель, ВТПериоды.СледующийВодитель, ВТПериоды.Авто УПОРЯДОЧИТЬ ПО СпидометрНаКонец |
|||
23
AceVi
27.01.16
✎
12:15
|
Хотя туплю. надо получать не следующию строку, а предыдущию. и если фамилия изменилась прибавлять номер доп группировки. тогда не важна длина последовательности.
|
|||
24
AceVi
27.01.16
✎
12:19
|
(22) Нет не так. У тебя нет ни одного соеднения - начнем с этого. СледующийВодитель - такого реквизита в твоих запросах нету. и даже если сделать соединение то твое решение ошибочно, такая группировка покажет совершенно ошибочный и оторванный от задания результат.
|
|||
25
ГеннадийУО
27.01.16
✎
12:20
|
(24) Ты запусти запрос, сам все увидишь.
|
|||
26
ГеннадийУО
27.01.16
✎
12:20
|
(25) А, понял, редактор часть запроса свернул.
|
|||
27
Alana_yar
27.01.16
✎
12:21
|
пока ход решения такой:
Добавила вычисляемое поле с формулой: ВЫбор когда Водитель = ВычислитьВыражение("Водитель","","","Предыдущая","Предыдущая","Автомобиль,Дата") Тогда 0 Иначе 1 конец теперь надо организовать по этому полю накопительный итог |
|||
28
ГеннадийУО
27.01.16
✎
12:24
|
(27) Попробуй запрос из 22, вроде работает...
|
|||
29
AceVi
27.01.16
✎
12:30
|
(28) Увидел скрытый кусок запроса. Вообще то все равно не работает. Для ситуации В1-В2-В1 рботает. а уже для
В1 В1 В2 В2 В3 В3 После его группировки будет такая картина В1 В2 В1 В3 В2 В3 В3 NULL Как видим 1 последовательность задвоиться. ну и т.д. |
|||
30
zidane321
27.01.16
✎
12:34
|
Скинул на вашу почту, если заработает, скинете сюда решение.
|
|||
31
AceVi
27.01.16
✎
15:18
|
(30) 1. Уже первое условие соединения я не понял - 2.СпидНаНач2=СпидомНаКон1 - что? ты сравниваешь скорости? они же могут быть любыми, почему ты их сравниваешь?
Хорошо - в приведенной тобой получившейя таблице в п1 таблице - ты соединил между собой изначальную таблицу со сдвигом строки -1 . И это верный ход. Но ты этого не написал, называется догадайся сам. В полученной таблице ты упустил 1 строку будет так Авто1 |07.01.16|Иванов |NULL| 80 | 90 |NULL Или ты ее убрал из итогового таб 1 пункта? но опять же не указал это условие. 2. Во овтором пункте ты не указал как запросом получить такую таблицу - в цикле ее можно получить. запросом ты ее не получишь. 2. Скидывать надо все таки тс) я проверять не хочу. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |