Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 14.12.2017, 02:15
Konstantin-78 Konstantin-78 вне форума
Новичок
 
Регистрация: 27.04.2015
Сообщения: 76
Версия Delphi: Delphi7
Репутация: 10
По умолчанию Потерялся в наборе данных 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 свои.

Заранее спасибо за ответ.
Изображения
Тип файла: png Untitled.png (18.7 Кбайт, 11 просмотров)

Последний раз редактировалось Konstantin-78, 14.12.2017 в 02:19.
Ответить с цитированием
  #2  
Старый 14.12.2017, 02:20
Аватар для Guaho
Guaho Guaho вне форума
Начинающий
 
Регистрация: 27.08.2017
Сообщения: 173
Версия Delphi: Delphi7
Репутация: 10
По умолчанию

Задача не ясна. Опишите её корректнее.
Цитата:
Сообщение от Konstantin-78
...Например если я нахожусь на строке 15.11.2017 то это будет 0,039-0,026...
Откуда эти цифры? Где они во вложениях? Непонятка полная.
Ответить с цитированием
  #3  
Старый 14.12.2017, 02:34
Konstantin-78 Konstantin-78 вне форума
Новичок
 
Регистрация: 27.04.2015
Сообщения: 76
Версия Delphi: Delphi7
Репутация: 10
По умолчанию

Цитата:
Сообщение от Guaho
Задача не ясна. Опишите её корректнее.
Откуда эти цифры? Где они во вложениях? Непонятка полная.

смотрите, как показано в таблице, есть СКО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  
Старый 14.12.2017, 06:20
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,003
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

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  
Старый 14.12.2017, 13:19
Konstantin-78 Konstantin-78 вне форума
Новичок
 
Регистрация: 27.04.2015
Сообщения: 76
Версия Delphi: Delphi7
Репутация: 10
По умолчанию

Цитата:
Сообщение от lmikle
1. Можно сразу подготовить DataSet. Группируем по датам и сразу складываем твои СКО:
Код:
select DATE_CONTROL, SUM(COALESCE(CKO1,0) + COALESCE(CKO3,0)) as VALUE GROUP BY DATE_CONTROL ORDER BY DATE_CONTROL

Задумка хорошая, но запрос почемуто не суммирует СКО у одинаковых дат, а просто значения СКО выводит в один столбец. и "VALUE" к томуже зарезервированное слово, изменил на "VALUE1"

Последний раз редактировалось Konstantin-78, 14.12.2017 в 13:24.
Ответить с цитированием
  #6  
Старый 14.12.2017, 19:58
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,003
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

А-а-а... я не внимательно посмотрел. Для 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  
Старый 14.12.2017, 21:57
Konstantin-78 Konstantin-78 вне форума
Новичок
 
Регистрация: 27.04.2015
Сообщения: 76
Версия Delphi: Delphi7
Репутация: 10
По умолчанию

да заработало , еще раз спасибо

Код:
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  
Старый 15.12.2017, 03:07
Konstantin-78 Konstantin-78 вне форума
Новичок
 
Регистрация: 27.04.2015
Сообщения: 76
Версия Delphi: Delphi7
Репутация: 10
По умолчанию

а подскажите пожалуйста еще такой момент

в 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  
Старый 15.12.2017, 21:33
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,003
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Тогда попробуй вот так:
Код:
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  
Старый 18.12.2017, 02:44
Konstantin-78 Konstantin-78 вне форума
Новичок
 
Регистрация: 27.04.2015
Сообщения: 76
Версия Delphi: Delphi7
Репутация: 10
По умолчанию

остановился на
Код:
... nullif(sum(coalesce(CKO1,0)+coalesce(CKO3,0)), 0) as SUM_CKO...
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 17:26.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter