Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 5 347

/ вопрос решён /

Здравствуйте, уважаемые эксперты! Не знаю, как сделать «запрос в запросе», и вообще возможно ли это?! Например по ниже приведенному коду я делаю запрос по столбцу «Иногородние» равняющемуся значению «Да», но дело в том что из этого полученного числа программа должна осуществить второй запрос по столбцу «Пол». Т. е показать сколько иногородних, и сколько из них женского пола и мужского пола. Пожалуйста помогите, решить проблему!?

Приложение:
  1. datamodule3.ADOQuery2.SQL.Clear;
  2.  
  3. datamodule3.ADOQuery2.Active:=true;
  4. form7.sEdit5.Text:= inttostr (datamodule3.ADOQuery2.RecordCount);


alexlafa Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задал: 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

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

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;
Мережников Андрей

Мережников Андрей (статус: Абитуриент), 31 мая 2011, 21:27 [#6]:

какая ошибка выходит?
alexlafa

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

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

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

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

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

alexlafa (статус: Посетитель), 1 июня 2011, 18:47 [#18]:

Мережников Андрей: Извините насчет Пол = Да или Нет, это я ошибся, не соображаю уже что пишу. Я исправил предыдущие свое сообщение, как должно быть! У меня уже есть база с более 1200 студентов для этого года, следующий год она будит забиваться уже через прогу. Если конечно я её сделаю, и доведу до ума!
alexlafa

alexlafa (статус: Посетитель), 1 июня 2011, 18:58 [#19]:

Если можно еще маленький вопрос про SQL делаються ли запросы по всем столбцам сразу. Допустим есть Эдит в него заносим слово, а запрос делает поиск сразу во всех столбцах, все что находит выводит в дбгрид!?
bugmenot

bugmenot (статус: 3-ий класс), 1 июня 2011, 19:53 [#20]:

Цитата (Мережников Андрей):

у автора уже есть созданная и заполненная БД

Слабо верится, при виде этого:

Цитата (alexlafa):

FROM Таблица1

А вот отсутствие реакции на мой пост с агрегацией скорее говорит о том, что ОП доволен схемой (которую до сих пор так и не показал, кстати).

Цитата (Мережников Андрей):

varchar(1), что будет занимать 1 байт

VARCHAR(1), лолшто? CHAR(1) же! Ремарка про байтики тоже :-\
VARCHAR(255) - самый "гибкий" тип в SQL, поэтому используется в самом жутком DDL.

А замена типов констрейнтами - чистое изобретательство велосипедов.
виконання програми розпочинається з того самого мiсця, де призупинилося.

Страницы: [1] [2] [Следующая »]

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:54
Выполнено за 0.03 сек.