|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Потерялся в наборе данных DataSet
Доброе время суток. Задача вообщем то простая, но я запутался в лабиринтах if, else и все это в цикле while.
Не могу придумать правильный алгоритм... В общем есть DataSet с набором вот таких данных. см. вложение введите сюда описание изображения Нужно получить из них разность СКО1 СМЕЖНЫХ дат, по которой я строю график. Например если я нахожусь на строке 15.11.2017 то это будет 0,039-0,026. Вопросов бы не возникало бы, если при одинаковых датах не нужно было складывать СКО1 с СКО3 и с суммы обратно получать разность, например когда находишься на дате 01.12.2017, то это будет 0,005+0,016-0,010. Я просто теряюсь в какой переменной у меня уменьшаемое, а в каком вычитаемое… и заносятся они все время в разные переменные, нужно ставить дополнительные флаги... это просто ппп… Алгоритм как бы не очень ясен Я уже не знаю, может нужно организовать дополнительный массив уменьшаемых, и вычитаемых, и когда они сформируются (значения при одинаковых датах) тогда только вычислять разность. Разности конечно для каждых ID свои. Заранее спасибо за ответ. Последний раз редактировалось Konstantin-78, 14.12.2017 в 02:19. |
#2
|
||||
|
||||
Задача не ясна. Опишите её корректнее.
Цитата:
|
#3
|
|||
|
|||
Цитата:
смотрите, как показано в таблице, есть СКО1 и СКО3, которые привязаны к датам. Даты идут по возрастанию. Мне нужно получить разность чисел в поле СКО1, если даты различаются друг от друга на 1 день не более. Итак первое значение 0,026 относится к 12.11.17 второе значение 0,039 относится к 13.11.17 разнось между этими датами 1 день, значит 0,039-0,026. т.к. 14.11.17 - нет, то мы пропускаем.. потом надо найти разность СКО между 15.11.17 и 16.11.17 (разность 1 день) и т.д. это пока просто ... вопросы появились если есть например дата 01.12.17, к которой привязаны два числа 0,016 и 0,005 (СКО1 и СКО3), если 2 числа привязаны к одной дате, то мы их суммируем и потом отнимаем число за 30.11.17 0,010 После этой даты начинаем отсчет заново, т.к. СКО "обнуляется" (и брать разность между 02.12.17 и 01.12.17 не имеет смысла). Эти разности будут отображаться на графике, таким образом будет видно "мощность" на каждый день. Последний раз редактировалось Konstantin-78, 14.12.2017 в 03:01. |
#4
|
|||
|
|||
1. Можно сразу подготовить DataSet. Группируем по датам и сразу складываем твои СКО:
Код:
select DATE_CONTROL, SUM(COALESCE(CKO1,0) + COALESCE(CKO3,0)) as VALUE GROUP BY DATE_CONTROL ORDER BY DATE_CONTROL 2. Ну а теперь простым циклом перебираем записи и высчитываем разницу: Код:
var Prev : Double; begin Prev := 0; DataSet.First; While Not DataSet.EOF Do begin AddPoint(DataSet.FieldByName('DATE_CONTROL').AsDateTime,DataSet.FieldByName('Value').AsFloat - Prev); Prev := DataSet.FieldByName('Value').AsFloat; DataSet.Next; end; PS. Можно все вычислить прямо в запросе, через оконные функции, но это для БД тяжелее, а потом все-равно "бежать" по датасету, так что смысла особого нет. |
#5
|
|||
|
|||
Цитата:
Задумка хорошая, но запрос почемуто не суммирует СКО у одинаковых дат, а просто значения СКО выводит в один столбец. и "VALUE" к томуже зарезервированное слово, изменил на "VALUE1" Последний раз редактировалось Konstantin-78, 14.12.2017 в 13:24. |
#6
|
|||
|
|||
А-а-а... я не внимательно посмотрел. Для DATE_CONTROL надо отрезать время. Посмотри как получить чистую дату в твоей БД (ты ж не написал какая). Нпример, для MS Access будет выглядеть примерно так:
Код:
select DateValue(DATE_CONTROL), SUM(COALESCE(CKO1,0) + COALESCE(CKO3,0)) as VALUE GROUP BY DATE_CONTROL ORDER BY DateValue(DATE_CONTROL) |
Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
Konstantin-78 (15.12.2017)
|
#7
|
|||
|
|||
да заработало , еще раз спасибо
Код:
select max(DATE_CONTROL), SUM(COALESCE(CKO1,0) + COALESCE(CK3PURSE_COUNT,0)) as VALUE1, COUNT(*) AS VALUE2 from table1 GROUP BY cast(DATE_CONTROL as date) и на строках где СКО складывается, есть признак ("VALUE2 = 2") Последний раз редактировалось Konstantin-78, 15.12.2017 в 02:59. |
#8
|
|||
|
|||
а подскажите пожалуйста еще такой момент
в CKO1 может быть значение "null" и мне в результате, нужно получать в этих строках не "0", а "null" (там где дата одна и при этом CKO1 = null) как показано на рис это нужно при дальнейшей обработке данных Я переделал запрос Код:
select max(DATE_CONTROL), case when СКО1 <> null then SUM(COALESCE(CKO1,0) + COALESCE(CK3,0)) as VALUE1, end, COUNT(*) AS VALUE2 from table1 GROUP BY cast(DATE_CONTROL as date) но у меня добавился поле "case" и во всех строках в VALUE1 стали значения = "null". Как мне переделать запрос? Последний раз редактировалось Konstantin-78, 15.12.2017 в 04:29. |
#9
|
|||
|
|||
Тогда попробуй вот так:
Код:
select max(DATE_CONTROL), SUM(case when CKO1 is null and CK3 is null then null else COALESCE(CKO1,0) + COALESCE(CK3,0) end) as VALUE1, COUNT(*) AS VALUE2 from table1 GROUP BY cast(DATE_CONTROL as date) но, вроде, должно сработать. если так не сработает, то придется во вложенный запрос заворачивать. |
#10
|
|||
|
|||
остановился на
Код:
... nullif(sum(coalesce(CKO1,0)+coalesce(CKO3,0)), 0) as SUM_CKO... |