| 
| 
 | Вопрос # 5 347/ вопрос решён / | 
 |  Здравствуйте, уважаемые эксперты! Не знаю, как сделать «запрос в запросе», и вообще возможно ли это?! Например по ниже приведенному коду я делаю запрос по столбцу «Иногородние» равняющемуся значению «Да», но дело в том что из этого полученного числа программа должна осуществить второй запрос по столбцу «Пол». Т. е показать сколько иногородних, и сколько  из них женского пола и мужского пола. Пожалуйста помогите, решить проблему!? Приложение:Переключить в обычный режим datamodule3.ADOQuery2.SQL.Clear; datamodule3.ADOQuery2.Active:=true;form7.sEdit5.Text:= inttostr (datamodule3.ADOQuery2.RecordCount);
|  |   Вопрос задал: alexlafa (статус: Посетитель)Вопрос отправлен: 31 мая 2011, 01:47
 Состояние вопроса: решён, ответов: 1.
 |  Ответ #1. Отвечает эксперт: Мережников Андрей Здравствуйте, alexlafa!Сделайте вот так:
 
 datamodule3.ADOQuery2.SQL.Text:='select count(*) as vsego,count(case when Пол=''М'' then 1 else 0 end) as kman from
Таблица1 where Иногородние=''Да''';тогда просто возьмете из полученного запроса значения полей: vsego - всего иногородних
 kman - количество среди них мужчин, ну а количество женщин = vsego-kman
 
|  | Ответ отправил: Мережников Андрей (статус: Абитуриент)Время отправки: 31 мая 2011, 05:46
 Оценка за ответ: 5
 Комментарий к оценке: Спасибо! |  
 Мини-форум вопросаВсего сообщений: 25; последнее сообщение — 3 июня 2011, 05:53; участников в обсуждении: 4. Страницы: [1] [2] [Следующая »]  
|   | Мережников Андрей (статус: Абитуриент), 31 мая 2011, 05:38 [#1]: Цитата (alexlafa): datamodule3.ADOQuery2.SQL.Text:='SELECT * FROM Таблица1 WHERE Иногородние=''Да'''; почему нельзя сделать так:
 datamodule3.ADOQuery2.SQL.Text:='SELECT * FROM Таблица1 WHERE (Иногородние=''Да'')and(Пол=)';?
 |  
|   | bugmenot (статус: 3-ий класс), 31 мая 2011, 11:32 [#2]:срочно в книжный за Грубером! никаких подзапросов здесь не нужно
 
 SELECT gender, COUNT(*) 
FROM students
WHERE nonresident
GROUP BY genderи с какого перепуга очевидно логическая колонка хранит всякий символьный мусор типа "Да", "Нет", "Не знаю" виконання програми розпочинається з того самого мiсця, де призупинилося.
 
 |  
|   | Мережников Андрей (статус: Абитуриент), 31 мая 2011, 19:27 [#3]: Цитата (bugmenot): и с какого перепуга очевидно логическая колонка хранит всякий символьный мусор структура БД может быть любой, кстати не все СУБД поддерживают логический тип данных.
 |  
|   | alexlafa (статус: Посетитель), 31 мая 2011, 21:16 [#4]:Мережников Андрей! Доброго времени суток, скажите запрос делаю по вашему ответу, только не разобрался как выводить в разные «Эдиты». А то я вывод делал вот так: «form7.sEdit6.Text:= inttostr (datamodule3.ADOQuery2.RecordCount);» сейчас ошибка выходит!!! Не могли бы вы все поподробней описать пожалуйста, просто мне потом надо будит по трем столбцам делать запрос! |  
|   | Мережников Андрей (статус: Абитуриент), 31 мая 2011, 21:26 [#5]:form7.sedit6.text:=datamodule3.adoquery2.Fieldbyname('vsego').asString; |  
|   | alexlafa (статус: Посетитель), 31 мая 2011, 21:55 [#7]:Текст ошибки: "Project Project1.exe raised exception class EOleException with message ‘Неопознанная ошибка’. Process stopped. Use Step or Run to continue." 
 form7.sedit5.text:=datamodule3.adoquery2.Fieldbyname('vsego').asString;
form7.sedit6.text:=datamodule3.adoquery2.Fieldbyname('kman').asString;
form7.sedit7.text:=datamodule3.adoquery2.Fieldbyname('vsego-kman').asString; // сделал так, все ровно это же ошибка и
указывает на эти строки! |  
|   | alexlafa (статус: Посетитель), 31 мая 2011, 22:27 [#8]: datamodule3.ADOQuery2.SQL.Clear;
datamodule3.ADOQuery2.SQL.Text:='SELECT * FROM Таблица1 WHERE (Иногородние=''Да'')and(Пол=''%'+'муж'+'%'')';
datamodule3.ADOQuery2.Active:=true;
form7.sEdit7.Text:= inttostr (datamodule3.ADOQuery2.RecordCount); Попробовал сделать по вашему второму варианту. Все работает, но выдает 0, хотя в базе присутствует студенты «Иногородние» мужского пола. Этот вариант проще для меня, но не дает нужных результатов! Я правильно понимаю суть запроса сначала он находит иногородние = Да, а потом из них пол = Мужской?
 |  
|   | Мережников Андрей (статус: Абитуриент), 1 июня 2011, 05:38 [#9]: Цитата (alexlafa): form7.sedit7.text:=datamodule3.adoquery2.Fieldbyname('vsego-kman').asString; этой строки быть не должно вообще - такого поля в запросе нет.
 Какие на самом деле значения в колонке Пол? Какого типа поля в таблице? Приведите структуру таблицы.
 Приведите полностью текст запроса, который ввели, может что-то пропустили?
 |  
|   | alexlafa (статус: Посетитель), 1 июня 2011, 14:09 [#10]:Мережников Андрей: Какие на самом деле значения в колонке Пол? В колонке Иногородние заносяться значение через Checkbox, если cheked= true то значение "Да", Если если cheked=false то значение "Нет", а колонка Пол=мужской или женский через Combobox. Тип полей текстовый. 
 datamodule3.ADOQuery2.SQL.Clear;
datamodule3.ADOQuery2.SQL.Text:='select count(*) as vsego,count(case when Пол=''%'+'муж'+'%'' then 1 else 0 end) as kman
from Таблица1 where Иногородние=''Да''';
datamodule3.ADOQuery2.Active:=true;
form7.sedit5.text:=datamodule3.adoquery2.Fieldbyname('vsego').asString;
form7.sedit6.text:=datamodule3.adoquery2.Fieldbyname('kman').asString;на этот запрос почему то выдает ошибку! Но разобрался со вторым вариантом запроса. Вроде считает, ошибок нет!
 
 datamodule3.ADOQuery2.SQL.Clear;
datamodule3.ADOQuery2.SQL.Text:='SELECT * FROM Таблица1 WHERE (Иногородние=''Да'')and(Пол LIKE ''%'+'муж'+'%'')';
datamodule3.ADOQuery2.Active:=true;
form7.sEdit7.Text:= inttostr (datamodule3.ADOQuery2.RecordCount);Но не уверен что правильно и надежно будит считаться отчетность, так как мало что понимаю в SQL, да и в Delphi пока ещё далеко не профессионал! |  
|   | bugmenot (статус: 3-ий класс), 1 июня 2011, 16:31 [#11]: Цитата (Мережников Андрей): кстати не все СУБД поддерживают логический тип данныхЗато числовой все поддерживают. виконання програми розпочинається з того самого мiсця, де призупинилося.
 
 |  
|   | Мережников Андрей (статус: Абитуриент), 1 июня 2011, 16:52 [#12]: Цитата (alexlafa): datamodule3.ADOQuery2.SQL.Text:='SELECT * FROM Таблица1 WHERE (Иногородние=''Да'')and(Пол LIKE ''%'+'муж'+'%'')'; тогда почему пишете в условии 'муж', а не 'Да', если это соответствует мужскому полу? и для чего like, если значение строго определено?
 |  
|   | Мережников Андрей (статус: Абитуриент), 1 июня 2011, 16:54 [#13]: Цитата (bugmenot): Зато числовой все поддерживают а числовое поле подразумевает только два значения?
 |  
|   | Вадим К (статус: Академик), 1 июня 2011, 17:01 [#14]:а может "Пол" может быть равен "мужен" - и не он и не она   Галочка "подтверждения прочтения" - вселенское зло. |  
|   | Мережников Андрей (статус: Абитуриент), 1 июня 2011, 17:25 [#15]: Цитата (Вадим К): а может "Пол" может быть равен "мужен" - и не он и не она 
  смешно. автор написал какие значения записываются в это поле в одном из предыдущих постов |  
|   | bugmenot (статус: 3-ий класс), 1 июня 2011, 17:35 [#16]: Цитата (Мережников Андрей): а числовое поле подразумевает только два значения?Вы прикалываетесь или действительно думаете, что VARCHAR(255) идеально подходит для всех колонок? 
 
 Цитата (Вадим К): "Пол" может быть равен "мужен"Андрогин :-D. На самом деле неопределенный пол выставить строке гораздо проще, достаточно написать "ЖЕн" или "Муж ". 
 Вот поддержка ENUM действительно редкость
 виконання програми розпочинається з того самого мiсця, де призупинилося.
 
 |  
|   | Мережников Андрей (статус: Абитуриент), 1 июня 2011, 17:54 [#17]: Цитата (bugmenot): Вы прикалываетесь или действительно думаете, что VARCHAR(255) идеально подходит для всех колонок? Я так не считаю. В данном случае исхожу только из того, что у автора уже есть созданная и заполненная БД.
 Кстати, а почему именно varchar(255) - есть ведь и другие значения, например varchar(1), что будет занимать 1 байт, а числовое поле - минимум 4.
 Для того, чтобы в поле было определенное значение существуют проверки и преобразования перед записью.
 |  
|   | alexlafa (статус: Посетитель), 1 июня 2011, 18:47 [#18]:Мережников Андрей: Извините насчет Пол = Да или Нет, это я ошибся, не соображаю уже что пишу. Я исправил предыдущие свое сообщение, как должно быть! У меня уже есть база с более 1200 студентов для этого года, следующий год она будит забиваться уже через прогу. Если конечно я её сделаю, и доведу до ума! |  
|   | alexlafa (статус: Посетитель), 1 июня 2011, 18:58 [#19]:Если можно еще маленький вопрос про SQL делаються ли запросы по всем столбцам сразу. Допустим есть Эдит в него заносим слово, а запрос делает поиск сразу во всех столбцах, все что находит выводит в дбгрид!? |  
|   | bugmenot (статус: 3-ий класс), 1 июня 2011, 19:53 [#20]: Цитата (Мережников Андрей): у автора уже есть созданная и заполненная БД Слабо верится, при виде этого:
 
 Цитата (alexlafa): FROM Таблица1 А вот отсутствие реакции на мой пост с агрегацией скорее говорит о том, что ОП доволен схемой (которую до сих пор так и не показал, кстати).
 
 
 Цитата (Мережников Андрей): varchar(1), что будет занимать 1 байт VARCHAR(1), лолшто? CHAR(1) же! Ремарка про байтики тоже :-\
 VARCHAR(255) - самый "гибкий" тип в SQL, поэтому используется в самом жутком DDL.
 
 А замена типов констрейнтами - чистое изобретательство велосипедов.
 виконання програми розпочинається з того самого мiсця, де призупинилося.
 
 |  Страницы: [1] [2] [Следующая »]  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |