Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.11.26;
Скачать: CL | DM;

Вниз

Как 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;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.042 c
15-1163064875
двоечщник
2006-11-09 12:34
2006.11.26
Мобильник + оксид водорода


3-1158742757
tor84
2006-09-20 12:59
2006.11.26
Переместить данные из dbf(866) в Access


5-1143720622
Untermensch
2006-03-30 16:10
2006.11.26
Событие компонента по событию внутри дочернего потока


9-1139254718
D@rk
2006-02-06 22:38
2006.11.26
Fps


3-1159078435
Urvin
2006-09-24 10:13
2006.11.26
Нет записи в бд с Firebird