Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
4-1152879465
Acidlex
2006-07-14 16:17
2006.11.26
Эмуляция нажатия клавиш в чужом окне


8-1145342391
mike66
2006-04-18 10:39
2006.11.26
bezie


15-1162815807
TIF
2006-11-06 15:23
2006.11.26
C++ или Delphi


2-1162905180
Gunek
2006-11-07 16:13
2006.11.26
Переменная в запросе


2-1162898517
alucard
2006-11-07 14:21
2006.11.26
Подскадине где компонент SocketConnection?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский