Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.038 c
15-1179865500
antonn
2007-05-23 00:25
2007.06.17
логин юзера на сайт (общий вопрос по безопасности)


1-1176985318
DestWib
2007-04-19 16:21
2007.06.17
Как удалить файл, напрямую записывая нули на винт


9-1153360589
RobinBad
2006-07-20 05:56
2007.06.17
Установка Glscene


2-1180346730
nem0
2007-05-28 14:05
2007.06.17
File To String


2-1180272830
Calibr
2007-05-27 17:33
2007.06.17
Как открыть архив с паролем?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский