|
Вопрос # 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] [Следующая »]
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|