Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.02.2014, 20:31   #1
govorun1
Форумчанин
 
Регистрация: 08.11.2013
Сообщений: 137
По умолчанию Запрос к запросу

Имеется запрос1 к базе.
Как записать запрос2, что бы он работал ТОЛЬКО с данными, полученными в запросе1.
Что то типа
Код:
select...From adoquery1 where...
Можно конечно в запросе2 указать теже условия что и в запросе1, но для верности хочется работать с уже отобранными данными.
govorun1 вне форума Ответить с цитированием
Старый 16.02.2014, 20:41   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Это называется вложенный запрос
Код:
SELECT U.* FROM (SELECT ...) AS U ...
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 16.02.2014, 20:49   #3
govorun1
Форумчанин
 
Регистрация: 08.11.2013
Сообщений: 137
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Это называется вложенный запрос
Код:
SELECT U.* FROM (SELECT ...) AS U ...
Т.е. отдельный запрос к уже отобранным данным сделать нельзя?
govorun1 вне форума Ответить с цитированием
Старый 16.02.2014, 20:56   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Делайте представление
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 16.02.2014, 22:08   #5
govorun1
Форумчанин
 
Регистрация: 08.11.2013
Сообщений: 137
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Делайте представление
Вот первый запрос
Код:
A1:=STRTOINT(FORM2.Edit1.Text);
    ADOQUERY1.Close;
    ADOQUERY1.SQL.Text:='select S, OTD, DATA_POS, FIO, SUMMA, VAL, SD_V_KL, SD_V_CBU '+
                        'FROM INKASSO '+
                        'WHERE OTD=:A1 AND SD_V_KL<>1 AND SD_V_CBU<>1';
    ADOQUERY1.Parameters[0].Value:=A1;
    ADOQUERY1.Open;
Теперь нужно из первого запроса подсчитать сумму по полю 'SUMMA' where 'VAL' =30 as 30 и 'VAL' =40 as 40

AS 30 и AS 40 нужны, чтобы потом эти суммы показать в EDIT
govorun1 вне форума Ответить с цитированием
Старый 17.02.2014, 08:33   #6
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Цитата:
Т.е. отдельный запрос к уже отобранным данным сделать нельзя?
Не, в Вашем примере - нет. Но вполне можно сделать так, как выше писал Аватар. Или вообще обойтись одним запросом...
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...

Последний раз редактировалось Sciv; 17.02.2014 в 08:35.
Sciv вне форума Ответить с цитированием
Старый 17.02.2014, 12:11   #7
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

можно к полученному набору (Dataset) применить фильтрацию и в цикле(!) посчитать нужное.
Код:
ds.Filter:='val=30';
r:=0;
ds.Filtred:=true;
ds.first;
f:=ds.Fieldbyname('summa');
while not ds.EOF do begin 
  r:=r+f.asInteger;
  ds.Next;
end;
ds.filtred:=false;
Считать надо две величины с разными(!) условиями?
1. пишем два цикла
2. отказываемся от filter и честно проверяем условия в цикле.
Код:
  v:=ds.Fieldbyname('val');
  
  case v.Asinteger of
  30: r30:=r30+f.AsInteger;
  50: r50:=r50+f.AsInteger;
  else rx:=rx+f.Asinteger;
  end;
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 17.02.2014 в 12:15.
evg_m на форуме Ответить с цитированием
Старый 17.02.2014, 20:47   #8
govorun1
Форумчанин
 
Регистрация: 08.11.2013
Сообщений: 137
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
Считать надо две величины с разными(!) условиями?
1. пишем два цикла
2. отказываемся от filter и честно проверяем условия в цикле.
Код:
  v:=ds.Fieldbyname('val');
  
  case v.Asinteger of
  30: r30:=r30+f.AsInteger;
  50: r50:=r50+f.AsInteger;
  else rx:=rx+f.Asinteger;
  end;
Считать нужно две величины: 'Summa' where 'val'=30 и 'Summa' where 'val'=40
Потом эти итоги отразить например в Edit1 и Edit2 соответственно.

Если честно, я в этом коде ну совсем ничего не понял...
У меня Access... Если мне это пойдет, то нельзя ли более по-народному написать. Просто если я не понимаю, то как правило я ищу другой выход, бзик у меня такой - сначало понять а потом уже писать...
Спасибо
govorun1 вне форума Ответить с цитированием
Старый 17.02.2014, 20:55   #9
ReportCube
Форумчанин
 
Аватар для ReportCube
 
Регистрация: 11.03.2011
Сообщений: 426
По умолчанию

Воспользуйтесь агрегатным суммирование через такую конструкцию
SUM(case VAL when 30 then SUMMA else 0 end) as Field_30
или для Access можно и так
SUM(IIF(VAL=30,SUMMA,0))

Последний раз редактировалось ReportCube; 17.02.2014 в 22:48.
ReportCube вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Отчет по запросу fakel-v БД в Delphi 1 29.12.2011 15:13
Выравнивание текста по запросу BaceK Помощь студентам 0 18.12.2011 11:53
Изображение по веб-запросу hamlook Microsoft Office Excel 10 24.02.2010 14:33
Скрыть листы по запросу RUBEY Microsoft Office Excel 23 16.01.2009 13:40
Сохранение по запросу Jura_71 БД в Delphi 2 07.01.2009 04:04