![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как SQL-запрос "заставить" правильно считать? [D7, Paradox]
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]
> но после выполнения запроса таблица примет другой вид,
Какая именно таблица примет другой вид?