Распространённый случай в расходометрии

У меня N расходомеров, ежедневно откладывающих в базу данных суточные расходы дифференциально по трём зонам суток, как числа с плавающей запятой. Мне нужно по каждому из приборов узнать расход за определённый период дифференицально по зонам суток и суммарный. Строил разные SQL-запросы, но они или возвращали неверные данные, или долго обрабатывались. Поля: объект, канал, дата, расход1, расход2, расход3. База - Firebird. Как сделать это попроще и, желательно,  быстро?

Думаю, что так:

SELECT канал, SUM(расход1) AS SUM1, SUM(расход2) AS SUM2, SUM(расход3) AS SUM3, SUM(расход1+расход2+расход3) AS SUM0 FROM TAB
WHERE объект = номер_объекта
AND дата>= нижняя_дата AND дата < верхняя_дата
GROUP BY канал

Далее обработайте возвращаемый результат примерно так:

        Query->First();
        while(!Query->Eof)
        {
                c = Query->FieldByName("канал")->AsInteger;
                Container[c-1][1] = Query->FieldByName("SUM1")->AsFloat;
                Container[c-1][2] = Query->FieldByName("SUM2")->AsFloat;
                Container[c-1][3] = Query->FieldByName("SUM3")->AsFloat;
                Container[c-1][0] = Query->FieldByName("SUM0")->AsFloat;
                Query->Next();
        }
        delete Query;

 

Если пытаться упорядочивать исходный массив или обрабатывать возвращаемые данные составным запросом, то по времени будет дольше.

Версия для печатиВерсия для печати

Рубрики: 

  • 1
  • 2
  • 3
  • 4
  • 5
Всего голосов: 0
Заметили ошибку? Выделите ее мышкой и нажмите Ctrl+Enter!

Читайте также