Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Запросы и БД! [D7, XP]


Страницы:   1 2

Loona ©   (2007-05-25 01:56:00) 

Здравствуйте, у меня возник вопрос:
есть БД, по SQL запросу выдает нужные данные - как теперь эти данные,т.е новую таблицу сохранить, чтобы потом можно было работать с ее элементами?? мне нужно найти среднее значение в каждом столбце новой матрицы ( потом значение ячейки - среднее разделить на среднее и уможить на коэффициент и так 10 ячеек по каждому столбцу!!) а потом построить график...Помогите пожалуйста, совсем не получается :(((


Kostafey   (2007-05-28 00:56:00) [1]

> Для одного пациента в необходимое_поле1, 2, 3 есть по десять
> значений и мне их просуммировать надо!!!!!!

Это что ж получается. Одно поле содержит 10 значений ???
Если так, то рекомендую познакомится с нормализацией базы данных
(в частности с первой нормальной формой).

Это что за тип поля такой, в котором содержится 10 значений (притом видимо числовых)???

Если не так, то я ничего не понял.


> А получается что я суммирую все значения в необходимом_поле1(2,3)

Это > [29] Kostafey ©по-твоему так нужно описывать?
Не так. Поля результирующего набора данных значения вычисляются
путем ... (таких-то вычислений)
терминология в таком духе.


> а мне нужно только десять тех, которые принадлежат выбранному
> пациенту!

Опять несуразная, ИМХО фраза, ибо в > [29] Kostafey ©
вычисления производятся исключительно для 1 записи (т.е. параметры требуемого пациента).


> уф, вроде так.

Well, try again...


Loona   (2007-05-27 16:21:00) [2]

нее, не так я наверное опять туплю, извиняйте...

Для одного пациента в необходимое_поле1, 2, 3 есть по десять значений и мне их просуммировать надо!!!!!! для каждого поля в отдельности..
А получается что я суммирую все значения в необходимом_поле1(2,3) а мне нужно только десять тех, которые принадлежат выбранному пациенту!
уф, вроде так.


Kostafey   (2007-05-27 15:59:00) [3]

Так и в чем сложность?
Можно просто писать (заодно и параметры применим):


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 15:34:00) [4]


> Сформулируй доходчиво.
> <Цитата>

Ну я извиняюсь...

Нужно считать среднее не всех полей, а полей которые принадлежат этому пациенту. То есть для одной записи все делать!!!!


Kostafey   (2007-05-27 12:28:00) [5]

> получается что срднее он считает по всем полям, не только
> по тем что принадлежат выбранному пациенту

Считает и правильно делает. Я ведь именно так и понял вопрос.
А как еще нужно понимать фразу

> **значение ячейки минус среднее значение столбца и разделить
> на среднее!!!

Берем значение поля вычитаем из него значение среднего арифметического
всех значений этого поля, получившуюся разность делим опять на среднее.

Что нужно-то? Нужно среднее арифметическое 3-х полей таблицы параметры,
соответсвующей выбранному пациенту ?
Так так и скажи.

Сформулируй доходчиво.


Anatoly Podgoretsky   (2007-05-27 10:12:00) [6]

> Loona  (27.05.2007 03:01:24)  [24]

Используй параметры, а то постоянно будешь мучаться с подсчетом кавычек и введенными данными.


Loona   (2007-05-27 03:26:00) [7]

вообщем он считает для всех записей, хоть и на экране выводит для одной   :(((  совсем запуталась :(


Loona   (2007-05-27 03:01:00) [8]

Я наверное уже замучила, но все же...
получается что срднее он считает по всем полям, не только по тем что принадлежат выбранному пациенту, а когда пишу выбрать (
> 'where Фамилия like ''%'+EditFIO1.text+'% '            
>            +#13#10+
> 'and Пациент.Key1 = Исследование.ID_pat '              
>            +#13#10+
> 'and Исследование.Key1 = параметры.ID_inv ';
) выдает ошибку типа пропущен оператор :(((


Kostafey   (2007-05-26 21:19:00) [9]

> А где потом увидеть результаты всего этого и как их вывести?
> ? надо новое поле в таблице создать или как?

Мы получаем обычный набор данных.
Так и выводим его стандартными средствами.
Полям для удобства можно присвоить псевдонимы.
Вообще, по 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-26 21:01:00) [10]


> Это значит, что самое время перквалифицироваться в управдомы
> ;)

очень смешно:)))


MsGuns   (2007-05-26 20:51:00) [11]

>Loona ©   (26.05.07 20:35) [20]
>Что это значит?

Это значит, что самое время перквалифицироваться в управдомы ;)


Loona   (2007-05-26 20:35:00) [12]

выдает ошибку :
Project ... raised exception class EAccessViolation with Message 'Access violation at adress 1b041fc6 in module 'msjet40.dll'. read of adres 0005242E/ :(
Что это значит?


Loona   (2007-05-26 20:25:00) [13]


> Давай уже с терминологией дружить начнем.
>
> Столбцы и строчки - это к сеткам (DBGrid)
> Поля и записи, уху ?

уху :)

А где потом увидеть результаты всего этого и как их вывести?? надо новое поле в таблице создать или как?


Kostafey   (2007-05-26 16:52:00) [14]

Давай уже с терминологией дружить начнем.

Столбцы и строчки - это к сеткам (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;


MsGuns   (2007-05-26 16:32:00) [15]

>И каждый этот столбец нужно считать в соответствии с формулой! Т.е необходимо иметь доступ ко всем строчкам (их 10) и столбцам (их 3) чтбы все посчитать для одного пациента

Подумаешь, бином Ньютона (с)
Изучаем SQL.


Loona   (2007-05-26 15:47:00) [16]

> СУБД, технология доступа ?
БД  Access, ADO


> Вопрос я к сожалению до конца так и не понял, но попробую
> ответить на сколько понял.
>
> А что же я понял? Нужно получить набор данных из 1 записи
> (на самом деле их
> наверняка будет больше, ибо 'where Фамилия like ''%'+EditFIO1.
> text+'%'),
> содержащих 3 поля характеризующих параметры одного пациента,
>  при этом
> значение одного из полей должно вычисляться по принципу:
>


Из всех параметов соответствующих найденному пациенту - есть 3 столбца, которые хранятся в таблице "ПАРАМЕТРЫ" . И каждый этот столбец нужно считать в соответствии с формулой! Т.е необходимо иметь доступ ко всем строчкам (их 10) и столбцам (их 3) чтбы все посчитать для одного пациента.


Kostafey   (2007-05-26 13:34:00) [17]

> Скажу Вам как художник художнику: "Пациентов нужно идентифицировать
> по номеру истории болезни и ни как иначе"!

А поиск производить по фамилии.

Вообще, такие вещи должны согласовываться прежде всего с заказчиком,
исходя из предметной области и пожеланий пользователей.

Одним словом, сейчас это на совести автора сабжа.


DrAndrey   (2007-05-26 13:29:00) [18]

>DataModule1.FindQuery.SQL.Add('where Фамилия like ''%'+EditFIO1.text+'%''');

Скажу Вам как художник художнику: "Пациентов нужно идентифицировать по номеру истории болезни и ни как иначе"!


Kostafey   (2007-05-26 13:16:00) [19]

> 'and Исследование.Key1 = параметры.ID_inv ' +#13#10+

Конечно нужно писать 'and Исследование.Key1 = параметры.ID_inv ';


Kostafey   (2007-05-26 12:50:00) [20]

Необходимое_поле1, Необходимое_поле2, Необходимое_поле3 - заменить реальными именами полей.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо