У меня 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;
Если пытаться упорядочивать исходный массив или обрабатывать возвращаемые данные составным запросом, то по времени будет дольше.
Горячие темы