Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как SQL-запрос "заставить" правильно считать? [D7, Paradox]


Страницы:   1 2

Gunek ©   (2006-11-05 19:00:00) 

Здравствуйте, Уважаемые Мастера Delphi!
Проблема в правильном выводе результата запроса SQL: нужно из четырёх таблиц вывести одну. Таблицы такие:
1 avto.DB<Avto.Inv, Avto."Date", Avto.Cost, Avto.Marka>,
2 AZS.DB<Azs.Nvp, Azs.Inv, Azs.Fuel, Azs.Vl>,
3 Fprice.DB<Fprice.Fuel, Fprice.Price>,
4 remont.DB<Remont.Inv, Remont.Crack, Remont.Cost>
нужно сформировать:
<avto.inv,avto.marka,cost> , где cost - общие затраты на авто с инвентарным ном. avto.inv, которое получается путём суммирования затрат на топливо(sum(azs.vl*fprice.price)) , ремонт(remont.cost) и покупку(avto.cost).
Вот код моего запроса:
SELECT Avto.Inv, Avto.Marka, sum(azs.vl*fprice.price)+SUM(REMONT.COST)+AVTO.COST
FROM "avto.DB" Avto, "AZS.DB" Azs, "Fprice.DB" Fprice, "remont.DB" Remont
where avto.inv=azs.inv and avto.inv=remont.inv and azs.fuel=fprice.fuel
group by avto.inv, avto.marka

Но подсчитывает неправильно, проверил вручную, можно что-то исправить или добавить, как вы думаете?


ЮЮ   (2006-11-09 04:24:00) [1]

for i:=1 to query1.recordcount do begin
  query1.Close;
  ...
end;

И это, типа, пробежались по  query1?  А потом в закрытом НД ещё и поля "читаем".

З.Ы. Приведи код в порядок. и замени свои "циклы"
  for i:=1 to query1.recordcount do begin
   ...
 end;

на нормальные:
query.first;
 while not query.Eof do begin
   ...
   query.Next;
 end;


Gunek   (2006-11-06 21:43:00) [2]

Добрый вечер, мастера Delphi!
>В общем, брось ты эту бяку, Парадокс. Переходи на нормальные SQL серверные БД.
Какие, например?
И всё-таки если мой вопрос разрешить как-нибудь по-другому?
Вот например я придумал кое-что, но не совсем верно, возникает ошибка:
Query2.SQL.Text:=('SELECT Azs.Inv, sum (azs.vl*fprice.price) as Стоимость FROM "azs.DB" Azs, "Fprice.DB" Fprice where azs.fuel=fprice.fuel group by azs.inv');
query4.SQL.Text:='select inv,sum(cost) from remont group by inv;';
query1.SQL.Text:='select inv,marka,cost from avto;';
for i:=1 to query1.recordcount do begin
query1.Close;
for j:=1 to query2.RecordCount do begin
if
query1.FieldByName('inv').AsInteger=query2.FieldBy Name('inv').AsInteger then
cost:=cost+query2.FieldByName('Стоимость').AsFloat ;
query2.Next;
end;
query2.First;
query1.SQL.Text:='select inv,marka,cost+'''cost''' from avto;';
query1.Next;
end;


Проблема при прибавлении cost.


Johnmen   (2006-11-06 17:48:00) [3]


> unknown ©   (06.11.06 03:17) [27]


Ну зачем придираться к словам. В смысле, к их отсутствию :)
Все же поняли, что селективный запрос к таблицам.
И, кстати, ты уверен, что то, что ты описал в своем посте по поводу execute ststement 'alter table...и т.д.' работает, как ожидается, и не даёт ошибки?


> Gunek ©   (06.11.06 13:28) [31]
> Я наверное не получу конкретный ответ на свой вопрос?


Я вспомнил :)
Дело в том, что для локальных БД типа Парадокс не работает неявное соединение вложенных запросов с основным запросом. Т.е. вложенные запросы выполняются одинраз! Причём до начала обхода по внешнему запросу. А значит и условия вложенных запросов невыполнимы и всегда (в данном случае) будут давать NULL.

В общем, брось ты эту бяку, Парадокс. Переходи на нормальные SQL серверные БД.


Gunek   (2006-11-06 13:28:00) [4]

Я наверное не получу конкретный ответ на свой вопрос?


Ketmar   (2006-11-06 03:48:00) [5]

надеюсь, от "использовал вертикальный конструкционный элемент здания для причинения повреждений, несовместимых с жизнью"? (ц) DiamondShark


unknown   (2006-11-06 03:32:00) [6]


> Ketmar ©   (06.11.06 03:23) [28]

Это не в моей власти, к сожалению =)
Однако оценку текущего психического состояния и перспективу дальнейшего
материального обеспечения данного индивида я озвучил =)


Ketmar   (2006-11-06 03:23:00) [7]

>[27] unknown(c) 6-Nov-2006, 03:17
я надеюсь, чудо, написавшее такое, жило недолго и очень мучительно? %-)


unknown   (2006-11-06 03:17:00) [8]


> Johnmen ©   (05.11.06 23:32) [17]
>
> Как селективный запрос может изменить структуру таблицы?
>
> Науке такие явления неизвестны :)

<offtop>
Запросто. например в fb 1.5 - запрос на выборку из процедуры, в которой
неким программиздом между прочим задано execute ststement 'alter table...и т.д.'
не знаю, как науке, а мне такие печальные случаи известны :)
</offtop>


Gunek   (2006-11-06 01:49:00) [9]

>причина: нет записей, которые удовлетворяют условию where
"Невооружённым" глазом видно, что записи такие есть
>у Вас "картинка сложится"
Что бы это могло значить?


Petr V. Abramov   (2006-11-06 01:41:00) [10]

> Gunek ©   (06.11.06 01:30) [24]
причина: нет записей, которые удовлетворяют условию where
что делать: все же осознавать SQL Reference. просьба без обиды. в какой-то момент у Вас "картинка сложится"


Gunek   (2006-11-06 01:30:00) [11]

>какой-то из подзапросов ничего не возвращает
по какой причине это может быть?


Petr V. Abramov   (2006-11-06 01:26:00) [12]

> Но почему в поле  3. затраты на содержание ячейки пустые?
null + число = null. с этим надо смиртиться
какой-то из подзапросов ничего не возвращает


Gunek   (2006-11-06 01:19:00) [13]

Благодарю Вас, Johnmen. Но почему в поле  3. затраты на содержание ячейки пустые?


Johnmen   (2006-11-06 00:51:00) [14]

Запрос будет выглядить как указано в [3].
С тремя полями: 1. инв. ном. авто, 2. марка авто, 3. затраты на содержание


Gunek   (2006-11-06 00:47:00) [15]

Приношу свои извенения за столь непонятный вопрос.
Попробую его переформулировать.
Имеется несколько авто.
В таблице avto.DB записывается  его инв. ном.,дата покупки, марка,стоимость покупки.
В табл. AZS.DB записывается ном. выписки, инв. ном. авто, вид топлива, колич. выданных литров топлива.
В табл. Fprice.DB записаны : вид топлива, цена за 1 литр.
В табл. remont.DB записаны: инв. ном. авто, неисправность, затраты на устранение неисправности.

Как будет выглядеть запрос, результатом которого будет являться набор данных, состоящий из записей с полями: инв. ном. авто, марка авто, затраты на содержание?
Затраты на содержание подразумевают стоимость покупки, расходы на топливо и затраты на ремонт.


Johnmen   (2006-11-05 23:56:00) [16]


> в результате выполнения запроса не отобразятся некоторые
> столбцы.


Единственнымрезультатом выполнения селективного запроса всегда был и есть набор данных. Поля этого НД задаются в самом запросе.

Теперь попробуй ещё раз сформулировать свой вопрос. Применяя общепринятую терминологию.


Gunek   (2006-11-05 23:50:00) [17]

>Как селективный запрос может изменить структуру таблицы?
структура не изменится;  в результате выполнения запроса не отобразятся некоторые столбцы.


Johnmen   (2006-11-05 23:32:00) [18]

Как селективный запрос может изменить структуру таблицы?
Науке такие явления неизвестны :)


Gunek   (2006-11-05 23:15:00) [19]

>Какая именно таблица примет другой вид?

avto.DB<Avto.Inv, Avto."Date", Avto.Cost, Avto.Marka>

изменится на

avto.DB<Avto.Inv, Avto.Cost, Avto.Marka>


Johnmen   (2006-11-05 23:06:00) [20]


> но после выполнения запроса таблица примет другой вид,


Какая именно таблица примет другой вид?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо