Форум: "Начинающим";
Текущий архив: 2007.06.17;
Скачать: [xml.tar.bz2];
ВнизЗапросы и БД! Найти похожие ветки
← →
Loona © (2007-05-25 01:56) [0]Здравствуйте, у меня возник вопрос:
есть БД, по SQL запросу выдает нужные данные - как теперь эти данные,т.е новую таблицу сохранить, чтобы потом можно было работать с ее элементами?? мне нужно найти среднее значение в каждом столбце новой матрицы ( потом значение ячейки - среднее разделить на среднее и уможить на коэффициент и так 10 ячеек по каждому столбцу!!) а потом построить график...Помогите пожалуйста, совсем не получается :(((
← →
Loona © (2007-05-25 01:58) [1]**значение ячейки минус среднее значение столбца и разделить на среднее!!!
← →
Kostafey © (2007-05-25 02:03) [2]Ну-сс. Поехали.
СУБД, технология доступа ?
> новую таблицу сохранить
Вообще CREATE TABLE, но оно точно нужно?
Мжет быть лучше воспользоваться вложенным запросом ?
> потом значение ячейки - среднее разделить на среднее и уможить
> на коэффициент и так 10 ячеек по каждому столбцу!!)
жестко.
> Помогите пожалуйста, совсем не получается :(((
Ветка обещает быть длинной...
← →
Германн © (2007-05-25 02:22) [3]
> есть БД, по SQL запросу выдает нужные данные - как теперь
> эти данные,т.е новую таблицу сохранить, чтобы потом можно
> было работать с ее элементами??
А с результатом запроса работать нельзя по условиям задачи?
> мне нужно найти среднее значение в каждом столбце новой
> матрицы
А откуда тут пролезла эта противная матрица, блин? Зови на помощь Нео!
:)
Конец учебного года :(
← →
Kostafey © (2007-05-25 02:33) [4]> А с результатом запроса работать нельзя по условиям задачи?
Нет, нельзя. Это ж в наборе данных. К нему запрос не послать.
Нужно посылать новый запрос, который будет, похоже, включать в
себя текст старого только что посланного запроса.
Я у себя в дипломе эту задачу решил разделением запроса на части
с конструированием конечного варианта в зависимости от задачи.
Несколько веток на эту тему было.
← →
Германн © (2007-05-25 02:47) [5]
> Нет, нельзя. Это ж в наборе данных.
TDataSet что-ли?
← →
Kostafey © (2007-05-25 02:53) [6]> TDataSet что-ли?
Вроде того
← →
Германн © (2007-05-25 03:05) [7]
> Kostafey © (25.05.07 02:53) [6]
>
> > TDataSet что-ли?
>
> Вроде того
>
И что? Его нельзя никак подвергнуть математической обработке?
Т.е. есть данные, но сделать с ними ничего нельзя?
← →
Kostafey © (2007-05-25 03:12) [8]> И что? Его нельзя никак подвергнуть математической обработке?
>
> Т.е. есть данные, но сделать с ними ничего нельзя?
уху, прогнать по
DataSet.First
wile not DataSet.eof do
begin
DataSet.next
//Сичтаем среднее арифметическое
end
незабывая про
> **значение ячейки минус среднее значение столбца и разделить
> на среднее!!!
заново прогоняем цикл, формируя массив структур (record), состоящих из строк.
И выводим его в StringsList.
По моему не слишком красиво. Куда проще послать новый запрос.
← →
Германн © (2007-05-25 03:18) [9]
> Kostafey © (25.05.07 03:12) [8]
Тогда ждём"с автора. Пусть пояснит задачу.
← →
Loona © (2007-05-25 22:31) [10]Вот такой запрос выполняется
DataModule1.FindQuery.Active:=false;
DataModule1.FindQuery.SQL.Clear;
DataModule1.FindQuery.SQL.Add("select*");
DataModule1.FindQuery.SQL.Add("from Пациент, исслдование, параметры");
DataModule1.FindQuery.SQL.Add("where Фамилия like ""%"+EditFIO1.text+"%""");
Datamodule1.FindQuery.SQL.Add("and Пациент.Key1 = Исследование.ID_pat");
Datamodule1.FindQuery.SQL.Add("and Исследование.Key1 = параметры.ID_inv");
DataModule1.FindQuery.Active:= true;
PoiskForm.ShowModal;
Этот запрос выполняется. и получается новая таблица она состоит из 10 строк и 8 столбцов, меня интересуют данные выбранные для заданного пациента из таблицы "параметры".
И там уже с 3-мя столбцами мне нужно работать, считать среднее и т по формуле.
можно ли использовать свойство recordset.fields и тд?????
← →
Kostafey © (2007-05-26 12:48) [11]> СУБД, технология доступа ?
Не стоит такие вопросы игнорировать.
Давать русские названия таблицам крайне нежелательно. Или это псевдокод?
Вопрос я к сожалению до конца так и не понял, но попробую
ответить на сколько понял.
А что же я понял? Нужно получить набор данных из 1 записи (на самом деле их
наверняка будет больше, ибо "where Фамилия like ""%"+EditFIO1.text+"%"),
содержащих 3 поля характеризующих параметры одного пациента, при этом
значение одного из полей должно вычисляться по принципу:
> **значение ячейки минус среднее значение столбца и разделить
> на среднее!!!
Таким образом, принимая во внимание:
> меня интересуют данные выбранные для заданного пациента
> из таблицы "параметры".
Привожу в псевдокоде:
DataModule1.FindQuery.Active:=false;
DataModule1.FindQuery.SQL.Text:=
"select параметры.Необходимое_поле1, параметры.Необходимое_поле2, "+#13#10+
"(параметры.Необходимое_поле3 - " +#13#10+
" ( " +#13#10+
" select avg(параметры.Необходимое_поле3) from параметры " +#13#10+
" )) / " +#13#10+
" ( " +#13#10+
" select avg(параметры.Необходимое_поле3) from параметры " +#13#10+
" ) " +#13#10+
"from Пациент, исслдование, параметры " +#13#10+
"where Фамилия like ""%"+EditFIO1.text+"% " +#13#10+
"and Пациент.Key1 = Исследование.ID_pat " +#13#10+
"and Исследование.Key1 = параметры.ID_inv " +#13#10+
DataModule1.FindQuery.Active:= true;
PoiskForm.ShowModal;
← →
Kostafey © (2007-05-26 12:50) [12]Необходимое_поле1, Необходимое_поле2, Необходимое_поле3 - заменить реальными именами полей.
← →
Kostafey © (2007-05-26 13:16) [13]> "and Исследование.Key1 = параметры.ID_inv " +#13#10+
Конечно нужно писать "and Исследование.Key1 = параметры.ID_inv ";
← →
DrAndrey © (2007-05-26 13:29) [14]>DataModule1.FindQuery.SQL.Add("where Фамилия like ""%"+EditFIO1.text+"%""");
Скажу Вам как художник художнику: "Пациентов нужно идентифицировать по номеру истории болезни и ни как иначе"!
← →
Kostafey © (2007-05-26 13:34) [15]> Скажу Вам как художник художнику: "Пациентов нужно идентифицировать
> по номеру истории болезни и ни как иначе"!
А поиск производить по фамилии.
Вообще, такие вещи должны согласовываться прежде всего с заказчиком,
исходя из предметной области и пожеланий пользователей.
Одним словом, сейчас это на совести автора сабжа.
← →
Loona © (2007-05-26 15:47) [16]> СУБД, технология доступа ?
БД Access, ADO
> Вопрос я к сожалению до конца так и не понял, но попробую
> ответить на сколько понял.
>
> А что же я понял? Нужно получить набор данных из 1 записи
> (на самом деле их
> наверняка будет больше, ибо "where Фамилия like ""%"+EditFIO1.
> text+"%"),
> содержащих 3 поля характеризующих параметры одного пациента,
> при этом
> значение одного из полей должно вычисляться по принципу:
>
Из всех параметов соответствующих найденному пациенту - есть 3 столбца, которые хранятся в таблице "ПАРАМЕТРЫ" . И каждый этот столбец нужно считать в соответствии с формулой! Т.е необходимо иметь доступ ко всем строчкам (их 10) и столбцам (их 3) чтбы все посчитать для одного пациента.
← →
MsGuns © (2007-05-26 16:32) [17]>И каждый этот столбец нужно считать в соответствии с формулой! Т.е необходимо иметь доступ ко всем строчкам (их 10) и столбцам (их 3) чтбы все посчитать для одного пациента
Подумаешь, бином Ньютона (с)
Изучаем SQL.
← →
Kostafey © (2007-05-26 16:52) [18]Давай уже с терминологией дружить начнем.
Столбцы и строчки - это к сеткам (DBGrid)
Поля и записи, уху ?
> Из всех параметов соответствующих найденному пациенту -
> есть 3 столбца, которые хранятся в таблице "ПАРАМЕТРЫ" .
> И каждый этот столбец нужно считать в соответствии с формулой!
> Т.е необходимо иметь доступ ко всем строчкам (их 10) и
> столбцам (их 3) чтбы все посчитать для одного пациента.
А чем тогда > [11] Kostafey © не устраивает.
Каждое поле по такому принципу вычислять нужно? Можно просто писать:
DataModule1.FindQuery.Active:=false;
DataModule1.FindQuery.SQL.Text:=
"select " +#13#10+
"(параметры.Необходимое_поле1 - " +#13#10+
" ( " +#13#10+
" select avg(параметры.Необходимое_поле1) from параметры " +#13#10+
" )) / " +#13#10+
" ( " +#13#10+
" select avg(параметры.Необходимое_поле1) from параметры " +#13#10+
" ), " +#13#10+
"(параметры.Необходимое_поле2 - " +#13#10+
" ( " +#13#10+
" select avg(параметры.Необходимое_поле2) from параметры " +#13#10+
" )) / " +#13#10+
" ( " +#13#10+
" select avg(параметры.Необходимое_поле2) from параметры " +#13#10+
" ), " +#13#10+
"(параметры.Необходимое_поле3 - " +#13#10+
" ( " +#13#10+
" select avg(параметры.Необходимое_поле3) from параметры " +#13#10+
" )) / " +#13#10+
" ( " +#13#10+
" select avg(параметры.Необходимое_поле3) from параметры " +#13#10+
" ) " +#13#10+
"from Пациент, исслдование, параметры " +#13#10+
"where Фамилия like ""%"+EditFIO1.text+"% " +#13#10+
"and Пациент.Key1 = Исследование.ID_pat " +#13#10+
"and Исследование.Key1 = параметры.ID_inv ";
DataModule1.FindQuery.Active:= true;
PoiskForm.ShowModal;
← →
Loona © (2007-05-26 20:25) [19]
> Давай уже с терминологией дружить начнем.
>
> Столбцы и строчки - это к сеткам (DBGrid)
> Поля и записи, уху ?
уху :)
А где потом увидеть результаты всего этого и как их вывести?? надо новое поле в таблице создать или как?
← →
Loona © (2007-05-26 20:35) [20]выдает ошибку :
Project ... raised exception class EAccessViolation with Message "Access violation at adress 1b041fc6 in module "msjet40.dll". read of adres 0005242E/ :(
Что это значит?
← →
MsGuns © (2007-05-26 20:51) [21]>Loona © (26.05.07 20:35) [20]
>Что это значит?
Это значит, что самое время перквалифицироваться в управдомы ;)
← →
Loona © (2007-05-26 21:01) [22]
> Это значит, что самое время перквалифицироваться в управдомы
> ;)
очень смешно:)))
← →
Kostafey © (2007-05-26 21:19) [23]> А где потом увидеть результаты всего этого и как их вывести?
> ? надо новое поле в таблице создать или как?
Мы получаем обычный набор данных.
Так и выводим его стандартными средствами.
Полям для удобства можно присвоить псевдонимы.
Вообще, по SQL много в Internet информации есть.
> Что это значит?
Предположу, что я мог ошибится в наборе SQL, ибо я его не тестировал.
Протестировал теперь на Access. Исправь
>"select " +#13#10+
>"(параметры.Необходимое_поле1 - " +#13#10+
>" ( " +#13#10+
>" select avg(параметры.Необходимое_поле1) from параметры " +#13#10+
>" )) / " +#13#10+
>" ( " +#13#10+
>" select avg(параметры.Необходимое_поле1) from параметры " +#13#10+
>" ), " +#13#10+
на: (кавычки только добавить не забудь)
select
(
параметры.Необходимое_поле1 -
(
select avg(параметры.Необходимое_поле1) from параметры
)
) /
(
select avg(параметры.Необходимое_поле1) from параметры
)
from параметры
← →
Loona © (2007-05-27 03:01) [24]Я наверное уже замучила, но все же...
получается что срднее он считает по всем полям, не только по тем что принадлежат выбранному пациенту, а когда пишу выбрать (
> "where Фамилия like ""%"+EditFIO1.text+"% "
> +#13#10+
> "and Пациент.Key1 = Исследование.ID_pat "
> +#13#10+
> "and Исследование.Key1 = параметры.ID_inv ";
) выдает ошибку типа пропущен оператор :(((
← →
Loona © (2007-05-27 03:26) [25]вообщем он считает для всех записей, хоть и на экране выводит для одной :((( совсем запуталась :(
← →
Anatoly Podgoretsky © (2007-05-27 10:12) [26]> Loona (27.05.2007 03:01:24) [24]
Используй параметры, а то постоянно будешь мучаться с подсчетом кавычек и введенными данными.
← →
Kostafey © (2007-05-27 12:28) [27]> получается что срднее он считает по всем полям, не только
> по тем что принадлежат выбранному пациенту
Считает и правильно делает. Я ведь именно так и понял вопрос.
А как еще нужно понимать фразу
> **значение ячейки минус среднее значение столбца и разделить
> на среднее!!!
Берем значение поля вычитаем из него значение среднего арифметического
всех значений этого поля, получившуюся разность делим опять на среднее.
Что нужно-то? Нужно среднее арифметическое 3-х полей таблицы параметры,
соответсвующей выбранному пациенту ?
Так так и скажи.
Сформулируй доходчиво.
← →
Loona © (2007-05-27 15:34) [28]
> Сформулируй доходчиво.
> <Цитата>
Ну я извиняюсь...
Нужно считать среднее не всех полей, а полей которые принадлежат этому пациенту. То есть для одной записи все делать!!!!
← →
Kostafey © (2007-05-27 15:59) [29]Так и в чем сложность?
Можно просто писать (заодно и параметры применим):
select
(
параметры.Необходимое_поле1 -
(параметры.Необходимое_поле1+параметры.Необходимое_поле2+параметры.Необходимое_поле3)/3
),
(
параметры.Необходимое_поле2 -
(параметры.Необходимое_поле1+параметры.Необходимое_поле2+параметры.Необходимое_поле3)/3
),
(
параметры.Необходимое_поле3 -
(параметры.Необходимое_поле1+параметры.Необходимое_поле2+параметры.Необходимое_поле3)/3
)
from Пациент, исслдование, параметры
where Фамилия like %:FamiliyaParam%
and Пациент.Key1 = Исследование.ID_pat
and Исследование.Key1 = параметры.ID_inv
← →
Loona © (2007-05-27 16:21) [30]нее, не так я наверное опять туплю, извиняйте...
Для одного пациента в необходимое_поле1, 2, 3 есть по десять значений и мне их просуммировать надо!!!!!! для каждого поля в отдельности..
А получается что я суммирую все значения в необходимом_поле1(2,3) а мне нужно только десять тех, которые принадлежат выбранному пациенту!
уф, вроде так.
← →
Kostafey © (2007-05-28 00:56) [31]> Для одного пациента в необходимое_поле1, 2, 3 есть по десять
> значений и мне их просуммировать надо!!!!!!
Это что ж получается. Одно поле содержит 10 значений ???
Если так, то рекомендую познакомится с нормализацией базы данных
(в частности с первой нормальной формой).
Это что за тип поля такой, в котором содержится 10 значений (притом видимо числовых)???
Если не так, то я ничего не понял.
> А получается что я суммирую все значения в необходимом_поле1(2,3)
Это > [29] Kostafey © по-твоему так нужно описывать?
Не так. Поля результирующего набора данных значения вычисляются
путем ... (таких-то вычислений)
терминология в таком духе.
> а мне нужно только десять тех, которые принадлежат выбранному
> пациенту!
Опять несуразная, ИМХО фраза, ибо в > [29] Kostafey ©
вычисления производятся исключительно для 1 записи (т.е. параметры требуемого пациента).
> уф, вроде так.
Well, try again...
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2007.06.17;
Скачать: [xml.tar.bz2];
Память: 0.56 MB
Время: 0.049 c