Запрос с частичной условной агрегацией...

Тема в разделе "Delphi - Базы данных", создана пользователем Lunatikus, 9 июл 2007.

Статус темы:
Закрыта.
  1. Lunatikus

    Lunatikus Гость

    База MSSQL 2000.

    Есть набор данных по запросу ADOQuery,в котором одно из полей-дата.Есть другая таблица в базе,в которой также одно из полей-дата.Мне надо агрегировать поле ADOQuery.fields[0].asfloat по всем датам,попадающим в определенный интервал,который считается по второй таблице:c Table.fieldbyname('data')-7дней по Table.fieldbyname('data')+7дней.Т.е. говоря проще,надо суммировать значение строк из запроса у которых даты попадают в определенный интервал,находимый из другой таблицы.С датами у меня проблемы-поиск не помогает.И второй момент-можно ли сделать запрос из ADOQuery?
     
  2. Barmutik

    Barmutik Гость

    Что значит поиск не помогает? Так что операция SUM не рабоатет или в чём конкретно проблема?
     
  3. Lunatikus

    Lunatikus Гость

    Поиск ответа на данный вопрос по нету и по офруму в частности.Проблема конкретно в том что я:1)не знаю как задать условие на интервал даты 2)не знаю,можно ли делать запрос на основе ADOQuery и елси да то как?
     
  4. Barmutik

    Barmutik Гость

    Хммм...

    Код (Text):
    AdoQuery.Close;
    AdoQuery.SQL.Text :=
    ...MyDate >= :StartDate AND MyDate <= :EndDate...

    AdoQuery.Parameters.ParamByName('StartDate').Value := Date - 2;
    AdoQuery.Parameters.ParamByName('EndDate').Value := Date;
    AdoQuery.Open;
    Вот Вам задание диапазона от позавчера до сегодня...
     
  5. Lunatikus

    Lunatikus Гость

    а если не днями отнимать а месяцами?
    И мне надо не заменять внутренность запроса,а использовать полученный с помощью него набор данных и к нему применять новый запрос с этими условиями.
     
  6. SNike

    SNike Гость

    Вероятно, вложенные запросы помогут тебе :)
     
  7. Lunatikus

    Lunatikus Гость

    Мда?В первом запорсе впыолняется множество действий,результат которых-запись в базу данных.Время впыолнения запроса-примерно 2-2,5 часа.Операция должна быть выполнена единожды,так что это не таккая уж проблема.Проблема в том,что полученный набор данных в кэше после выполнения запроса надо еще обработать и получить другую выборку без занесения в базу и время выполнения его будет горррррраздо меньше.Так разве есть смысл вставлять нужный запрос в старый,чтобы сделать все сразу?
     
  8. SNike

    SNike Гость

    А что мешает делать все это разными запросами, или же, к примеру, создать временную таблицу?
     
  9. Lunatikus

    Lunatikus Гость

    Вот мне и интересно как сделать отдельный запрос,который будет использовать данные выполненного ADOQuery?Визуально и ручками.
     
  10. SNike

    SNike Гость

    Стоит ли все усложнять? Есть ведь StoredProc, можно создать временную таблицу, разбить один большой запрос на несколько поменьше...
    Сложно что-то сказать не зная самой цели и того, что должно происходить в запросах
     
  11. Lunatikus

    Lunatikus Гость

    Почитаю про storedproc-я пока не знаю ничего об этом компоненте.К тому же вопрос лишь в техническом плане:можно ли сделать еще один ADOQuery2 на основе старого ADOQuery1 типа
    ADOQuery2.SQL.text:='SELECT * FROM ADOQuery1';Ясное дело что тако нельзя.А как можно?
     
  12. SNike

    SNike Гость

    StoredProc - хранимые процедуры. Это не компоненты. Почитай по языку SQL, там много чего интересного есть ;)
    На счет "Как можно?" - все же использование промежуточных таблиц, или, что скорее всего, выбор другого варианта решения поставленной задачи :)
     
  13. Lunatikus

    Lunatikus Гость

    Насчет временной таблицы:
    SQL.Clear;
    SQL.Add(.... внутренний SQL);
    SQL.Open;
    DbiMakePermanent(handle, 'temp.db',true);
    SQL.Clear;
    SQL.Add(SELECT ... FROM 'temp.db'....);
    SQL.Open;

    Так?
    А насчет хранимых процедур-я просто видел такой компонент-ADOStoredProc.Не было нужды разбираться.Но раз ты советуешь,посмотрю.
     
  14. Barmutik

    Barmutik Гость

    Что-то я не допонял вот это вот применительно к MS SQL 2000

    Время выполнения запроса в 2.5 часа говорит о неверной организации данных в БД.... или не верной организации запроса ...
     
  15. SNike

    SNike Гость

    Да, что-то не так, слишком долго. Собстно, как и говорилось:
    <!--QuoteBegin-SNike+10:07:2007, 16:46 -->
    <span class="vbquote">(SNike @ 10:07:2007, 16:46 )</span><!--QuoteEBegin-->или, что скорее всего, выбор другого варианта решения поставленной задачи
    [snapback]71925" rel="nofollow" target="_blank[/snapback]​
    [/quote]
     
  16. Lunatikus

    Lunatikus Гость

    to Barmutik:
    у меня MS SQL 2002.Что к нему применительно?
    Насчет времени выполнения-повторюсь-операция разовая для наполнения базы.Запрос просто большой(с возвратами по строкам).

    to SNike:
    Мне сейчас интересно,как сделать временную таблицу и сохранить в ней полученный набор данных,чтобы осуществить еще один запрос.
     
  17. SNike

    SNike Гость

    Думаю, что можно использовать и подзапросы. Например,
    select * from (select * from My_table)

    Можно временные таблицы, но у них есть понятие "время жизни", так что стоит подумать использовать их или предварительно почитать книжки

    Как альтернатива - SELECT .... INTO ....



    <!--QuoteBegin-Lunatikus+11:07:2007, 16:11 -->
    <span class="vbquote">(Lunatikus @ 11:07:2007, 16:11 )</span><!--QuoteEBegin-->MS SQL 2002
    [snapback]72033" rel="nofollow" target="_blank[/snapback]​
    [/quote]

    В первом посте говорилось <!--QuoteBegin-Lunatikus+9:07:2007, 16:49 -->
    <span class="vbquote">(Lunatikus @ 9:07:2007, 16:49 )</span><!--QuoteEBegin-->База MSSQL 2000.

    [snapback]71792" rel="nofollow" target="_blank[/snapback]​
    [/quote]

    :)
     
  18. Barmutik

    Barmutik Гость

    Ну создавайте локальную или глобальную временную таблицу на сервере .. что конкретно интересно?

    Просто я как-то слабо верю что одиночный запрос МС СКЛ сервер будет 2.5 часа отрабатывать ... да он дропнет конекшин раньше .. хотя я конечно не знаю максимального времени таймаута для запроса.. может там и можно выставить 2.5 часс.. по умолчанию ж вроде 30 сек...

    Да и про MS SQL Server 2002 ...как-то я не в курсе про такой .. 6, 6.5, 2000, 2005, 2008 ... а вот 2002 .. это для меня что-то новое ... :D
     
  19. Lunatikus

    Lunatikus Гость

    Ошибся,конечно,совсем старый стал...версия 2000.У меня не запрос 2,5 часа выполняется,сорь,некорректно сформулировал.У меня действие по заполнению базы столько выполняется.Там программный цикл,в котором с каждым сдвигом строки по выполненному запросу выполняется ряд вычислений(в том числе со сдвигом строк назад и снова вперед) и полученные данные в виде update заносятся в базу.Так вот после данной операции мне и надо было взять полученный набор данных и к нему применить...елки-палки лес густой....во туплю...почему то все время считал что надо это делать во время выполнения этой громадной операции по начальному созданию базы....ведь можно же в конце...в виде простенького запроса....дурак....простите,что отнял время =(( и никакой временной таблицы не надо... :) пора мне отдохнуть от работы...
     
Загрузка...
Статус темы:
Закрыта.

Поделиться этой страницей