Форум: "Начинающим";
Текущий архив: 2006.11.26;
Скачать: [xml.tar.bz2];
ВнизКак SQL-запрос "заставить" правильно считать? Найти похожие ветки
← →
Gunek © (2006-11-05 19:00) [0]Здравствуйте, Уважаемые Мастера 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
Но подсчитывает неправильно, проверил вручную, можно что-то исправить или добавить, как вы думаете?
← →
Johnmen © (2006-11-05 19:16) [1]Естественно, что считает неправильно. Достаточно представить, как выглядит результат соединения таблиц.
Если бы не Парадокс, то я бы сказал, как написать запрос...
← →
Gunek © (2006-11-05 19:59) [2]Коротко поясню: для конкретного авто(avto.inv) нужно найти общие расходы: стоимость при покупке(avto.cost)+затраты на топливо(azs.vl*fprice.price)+затраты на ремонт(remont.cost)
← →
Johnmen © (2006-11-05 20:13) [3]А впрочем и на Парадоксе это будет работать:
SELECT
Avto.Inv,
Avto.Marka,
AVTO.COST +
(SELECT sum(azs.vl*fprice.price) FROM azs, fprice
WHERE avto.inv=azs.inv and azs.fuel=fprice.fuel) +
(SELECT SUM(REMONT.COST) FROM remont WHERE avto.inv=remont.inv)
FROM avto
← →
Gunek © (2006-11-05 20:34) [4]Так в поле COST вообще пустые ячейки.
← →
Johnmen © (2006-11-05 21:12) [5]Зачем тогда их учитывать при суммировании?
ЗЫ
В Парадоксе нет ф-ии преобразования null к 0. И нет условной ф-ии типа IIF.
← →
Gunek © (2006-11-05 21:47) [6]>Зачем тогда их учитывать при суммировании?
Ну чтобы посчитать общие затраты, значения в таблицах не null
← →
Johnmen © (2006-11-05 21:52) [7]
> Так в поле COST вообще пустые ячейки.
и
> значения в таблицах не null
Что-то здесь не так. Что?
← →
Gunek © (2006-11-05 22:01) [8]в поле COST вообще пустые ячейки - Это в результирующей таблице
значения в таблицах не null - в таблицах, из которых берутся данные
← →
Johnmen © (2006-11-05 22:15) [9]
> в поле COST вообще пустые ячейки - Это в результирующей
> таблице
Что за таблица?
← →
Gunek © (2006-11-05 22:22) [10]>Что за таблица?
SELECT
Avto.Inv,
Avto.Marka,
AVTO.COST +
(SELECT sum(azs.vl*fprice.price) FROM azs, fprice
WHERE avto.inv=azs.inv and azs.fuel=fprice.fuel) +
(SELECT SUM(REMONT.COST) FROM remont WHERE avto.inv=remont.inv)
FROM avto
← →
Johnmen © (2006-11-05 22:25) [11]Это запрос, а не таблица.
И где здесь "поле COST"?
← →
Gunek © (2006-11-05 22:34) [12]>Это запрос, а не таблица.
но визуально мы получаем таблицу
>И где здесь "поле COST"?avto.cost
← →
Johnmen © (2006-11-05 22:49) [13]
> >И где здесь "поле COST"?
> avto.cost
Это поле в таблице avto
← →
Gunek © (2006-11-05 23:01) [14]>Это поле в таблице avto
Да, согласен, но после выполнения запроса таблица примет другой вид, в поле COST которой и должна быть общая сумма
← →
Johnmen © (2006-11-05 23:06) [15]
> но после выполнения запроса таблица примет другой вид,
Какая именно таблица примет другой вид?
← →
Gunek © (2006-11-05 23:15) [16]>Какая именно таблица примет другой вид?
avto.DB<Avto.Inv, Avto."Date", Avto.Cost, Avto.Marka>
изменится на
avto.DB<Avto.Inv, Avto.Cost, Avto.Marka>
← →
Johnmen © (2006-11-05 23:32) [17]Как селективный запрос может изменить структуру таблицы?
Науке такие явления неизвестны :)
← →
Gunek © (2006-11-05 23:50) [18]>Как селективный запрос может изменить структуру таблицы?
структура не изменится; в результате выполнения запроса не отобразятся некоторые столбцы.
← →
Johnmen © (2006-11-05 23:56) [19]
> в результате выполнения запроса не отобразятся некоторые
> столбцы.
Единственным результатом выполнения селективного запроса всегда был и есть набор данных. Поля этого НД задаются в самом запросе.
Теперь попробуй ещё раз сформулировать свой вопрос. Применяя общепринятую терминологию.
← →
Gunek © (2006-11-06 00:47) [20]Приношу свои извенения за столь непонятный вопрос.
Попробую его переформулировать.
Имеется несколько авто.
В таблице avto.DB записывается его инв. ном.,дата покупки, марка,стоимость покупки.
В табл. AZS.DB записывается ном. выписки, инв. ном. авто, вид топлива, колич. выданных литров топлива.
В табл. Fprice.DB записаны : вид топлива, цена за 1 литр.
В табл. remont.DB записаны: инв. ном. авто, неисправность, затраты на устранение неисправности.
Как будет выглядеть запрос, результатом которого будет являться набор данных, состоящий из записей с полями: инв. ном. авто, марка авто, затраты на содержание?
Затраты на содержание подразумевают стоимость покупки, расходы на топливо и затраты на ремонт.
← →
Johnmen © (2006-11-06 00:51) [21]Запрос будет выглядить как указано в [3].
С тремя полями: 1. инв. ном. авто, 2. марка авто, 3. затраты на содержание
← →
Gunek © (2006-11-06 01:19) [22]Благодарю Вас, Johnmen. Но почему в поле 3. затраты на содержание ячейки пустые?
← →
Petr V. Abramov © (2006-11-06 01:26) [23]> Но почему в поле 3. затраты на содержание ячейки пустые?
null + число = null. с этим надо смиртиться
какой-то из подзапросов ничего не возвращает
← →
Gunek © (2006-11-06 01:30) [24]>какой-то из подзапросов ничего не возвращает
по какой причине это может быть?
← →
Petr V. Abramov © (2006-11-06 01:41) [25]> Gunek © (06.11.06 01:30) [24]
причина: нет записей, которые удовлетворяют условию where
что делать: все же осознавать SQL Reference. просьба без обиды. в какой-то момент у Вас "картинка сложится"
← →
Gunek © (2006-11-06 01:49) [26]>причина: нет записей, которые удовлетворяют условию where
"Невооружённым" глазом видно, что записи такие есть
>у Вас "картинка сложится"
Что бы это могло значить?
← →
unknown © (2006-11-06 03:17) [27]
> Johnmen © (05.11.06 23:32) [17]
>
> Как селективный запрос может изменить структуру таблицы?
>
> Науке такие явления неизвестны :)
<offtop>
Запросто. например в fb 1.5 - запрос на выборку из процедуры, в которой
неким программиздом между прочим задано execute ststement "alter table...и т.д."
не знаю, как науке, а мне такие печальные случаи известны :)
</offtop>
← →
Ketmar © (2006-11-06 03:23) [28]>[27] unknown(c) 6-Nov-2006, 03:17
я надеюсь, чудо, написавшее такое, жило недолго и очень мучительно? %-)
← →
unknown © (2006-11-06 03:32) [29]
> Ketmar © (06.11.06 03:23) [28]
Это не в моей власти, к сожалению =)
Однако оценку текущего психического состояния и перспективу дальнейшего
материального обеспечения данного индивида я озвучил =)
← →
Ketmar © (2006-11-06 03:48) [30]надеюсь, от "использовал вертикальный конструкционный элемент здания для причинения повреждений, несовместимых с жизнью"? (ц) DiamondShark
← →
Gunek © (2006-11-06 13:28) [31]Я наверное не получу конкретный ответ на свой вопрос?
← →
Johnmen © (2006-11-06 17:48) [32]
> unknown © (06.11.06 03:17) [27]
Ну зачем придираться к словам. В смысле, к их отсутствию :)
Все же поняли, что селективный запрос к таблицам.
И, кстати, ты уверен, что то, что ты описал в своем посте по поводу execute ststement "alter table...и т.д." работает, как ожидается, и не даёт ошибки?
> Gunek © (06.11.06 13:28) [31]
> Я наверное не получу конкретный ответ на свой вопрос?
Я вспомнил :)
Дело в том, что для локальных БД типа Парадокс не работает неявное соединение вложенных запросов с основным запросом. Т.е. вложенные запросы выполняются один раз! Причём до начала обхода по внешнему запросу. А значит и условия вложенных запросов невыполнимы и всегда (в данном случае) будут давать NULL.
В общем, брось ты эту бяку, Парадокс. Переходи на нормальные SQL серверные БД.
← →
Gunek © (2006-11-06 21:43) [33]Добрый вечер, мастера 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.
← →
ЮЮ © (2006-11-09 04:24) [34]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;
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.11.26;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.045 c