|
Вопрос # 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 sm1
- from(
- 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 Error
- SQL error code = -104
- Invalid command
- no 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)
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|