Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.06.17;
Скачать: CL | DM;

Вниз

Запросы и БД!   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.58 MB
Время: 0.016 c
3-1174975498
O.O
2007-03-27 10:04
2007.06.17
Выражение в Insert


2-1180444247
ыавпып
2007-05-29 17:10
2007.06.17
таблицы в MSAccess


9-1151275884
Goo
2006-06-26 02:51
2007.06.17
Rotate


2-1180090054
vitv
2007-05-25 14:47
2007.06.17
Пустая копия БД


1-1176194974
Pattern
2007-04-10 12:49
2007.06.17
Зависание программы при использовании TTimer