| 
| 
 | Вопрос # 4 953/ вопрос решён / | 
 |  Доброго времени суток, уважаемые эксперты!Подскажите, как правильно написать конструкцию SQL запроса.
 Есть БД на интербейсе. Туда складываются некие данные - каждые 3 минуты.
 
 Я накатал пока часть проги - но у меня один недостаток. В своем SQL запросе я не смог узнать после группирования - все ли данные существуют на каждые 3 мин. я просто их группирую и суммирую в SQL запросе. Можно ли сделать чтобы я брал откуда-то информацию - "данные не полные на определенное время.".
 Приложение:Переключить в обычный режим          SSql.Clear;         SSql.Add('SELECT D.DATADATE, sum(D.VALUE0) FROM GRITEMS GI INNER JOIN DATAPW D');         SSql.Add(' ON (GI.CSNO = D.CSNO) AND (GI.SSNO = D.SSNO) AND (GI.MBNO = D.MBNO) AND (GI.PTNO
= D.PTNO)');         SSql.Add(Format('WHERE (D.PARAM =%2d)',[PARAM30]));         SSql.Add(Format('AND (GI.GRNO =%2d)',[GRUPNOMER]));         SSql.Add(Format('AND (D.DATADATE>"%s")AND(D.DATADATE<="%s") group
 BY  D.DATADATE'         ,[DateTimeToStr(AVTime[1]),DateTimeToStr(AVTime[2])]));           Active:=False;         SQL:=SSql;         Active:=True;         FetchAll;         First;         i:=0;         while not Eof do         begin               Inc(i);              MasValue[i]:=Fields[2].AsVariant;               Next; if Eof then break;           end;         SSQL.Free;        except end;      End; /////////////////////////////              SSql.Add(Format('select   DATADATE , cnt, sm, case when (cnt < %2d)',[KolKanGr]));         SSql.Add('then 1 else 0 end sm1 from(');         SSql.Add('SELECT D.DATADATE, sum(D.VALUE0) FROM GRITEMS GI INNER JOIN DATAPW D');         SSql.Add(' ON (GI.CSNO = D.CSNO) AND (GI.SSNO = D.SSNO) AND (GI.MBNO = D.MBNO) AND (GI.PTNO
= D.PTNO)');         SSql.Add(Format('WHERE (D.PARAM =%2d)',[PARAM30]));         SSql.Add(Format('AND (GI.GRNO =%2d)',[GRUPNOMER]));         SSql.Add(Format('AND (D.DATADATE>"%s")AND(D.DATADATE<="%s") group
 BY  D.DATADATE)'         ,[DateTimeToStr(AVTime[1]),DateTimeToStr(AVTime[2])]));          Active:=False;         SQL:=SSql;         Active:=True;         FetchAll;         First;         i:=0;         while not Eof do         begin               Inc(i);               MasValue[i]:=Fields[2].AsVariant;                Next; if Eof then break;           end;         SSQL.Free;        except end;      End;  select   DATADATE , cnt, sm, case when cnt <5 then 1 else 0 end sm1from(  SELECT D.DATADATE,         sum(D.VALUE0*GI.SIGN) sm, count(*) cnt    FROM    GRITEMS GI         INNER JOIN            DATAPW D         ON     (GI.CSNO = D.CSNO)            AND (GI.SSNO = D.SSNO)            AND (GI.MBNO = D.MBNO)            AND (GI.PTNO = D.PTNO)   WHERE     (D.PARAM = 1)         AND GI.GRNO = '170'         AND (D.DATADATE > '23.12.2010')         AND (D.DATADATE <= '24.12.2010')group  BY  D.DATADATE)  Debugger Exception Notification---------------------------Project CHAZ.exe raised exception class EIBInterBaseError with message 'Dynamic SQL ErrorSQL error code = -104Invalid commandno column name specified for column number 2 in derived table <unnamed>'.---------------------------Break   Continue   Help   ---------------------------  
|  |   Вопрос задал: vitalik32 (статус: Посетитель)Вопрос отправлен: 24 января 2011, 15:47
 Состояние вопроса: решён, ответов: 0.
 |  
 Мини-форум вопросаВсего сообщений: 2; последнее сообщение — 25 января 2011, 16:03; участников в обсуждении: 2. 
|   | Ерёмин А.А. (статус: *Администратор), 25 января 2011, 15:52 [#1]:В запросе это вряд ли можно сделать. Если только завести вторую таблицу со списком всех временных интервалов, а потом через LEFT JOIN подцеплять к ней все данные — тогда если данных нет, строка из первой таблицы всё равно будет выбрана. 
 Альтернативный вариант — просто цикл в программе по всем интервалам.
 |  
|   | vitalik32 (статус: Посетитель), 25 января 2011, 16:03 [#2]:спасибо, попробую. |  25 января 2011, 16:18: Статус вопроса изменён на решённый (изменил автор вопроса — vitalik32) Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |