Модераторы: skyboy

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [MSSQL2000]Сбор случая лечения пациента, по нескольким посещениям  
:(
    Опции темы
SmArs
Дата 13.5.2008, 09:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 6.2.2007

Репутация: нет
Всего: нет



Здравствуйте.
вот например есть таблица пациентов и таблица их посещений к врачам, нужно чтобы из всех посещений пациента, например в данном месяце, по полю, идентифицирующему открытие/закрытие случая лечения (2-открытие, 3-закрытие), складывалась строка этого случая, с датами всех посещений внутри случая и их кол-вом.
Например:

ПАЦИЕНТЫ |       | ПОСЕЩЕНИЯ                        |
_________|        |_дата__|__код__|_пац____|
пациент1  |        |01.01.08|  2(откр)| пац1      |
пациент2  |        |02.01.08|     8       | пац1      |
..................|        |03.01.08|     9       | пац1      | 
                           |04.01.08|  3(закр)| пац1      |

после колдунства:

 |Имя пац-та|дата начала леч|дата оконч леч|даты посещ-й                 |колво посещ-й|код леч|
 |_________|______________|____________|____________________|____________|_______|
 |пациент1  |   01.01.08           |   04.01.08        |01.01;02.01;03.01;04.01|     4                 |   3        |


Я конечно догадываюсь, что одним запросом тут не обойтись, но все же можно ли хоть как нибудь приблизить к нужному виду эту картину?
PM MAIL   Вверх
skyboy
Дата 13.5.2008, 12:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 15
Всего: 260



т.е. выбрать все посещения, где дата посещения лежит между датой начала лечения и датой конца лечения в таблице "после колдунства"?
PM MAIL   Вверх
SmArs
Дата 13.5.2008, 12:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 6.2.2007

Репутация: нет
Всего: нет



после колдунства - это как должно получиться в итоге, а эти две даты определяются цифрами в поле "код", 2 - дата начала, 3-дата окончания. А все что между ними и они сами должны быть перечислены в формате "дд.мм" в поле "даты посещений".
PM MAIL   Вверх
skyboy
Дата 13.5.2008, 13:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 15
Всего: 260



Код

SELECT [пац], min([дата]), max([дата]), count(*)
FROM [посещения]
GROUP BY [пац]

однако, мне кажется, что у тебя в таблице "посещения" будут данные не за один период лечения, так?
кроме того, строку "01.01;02.01;03.01;04.01" в mysql легко получить операторо group_concat, а вот в mssql я подобной конструкции не знаю. 
может, вообще невозможно.
в результате поле "код лечения" соотвествует полю "код лечения" в записи с максимальной датой посещения?
PM MAIL   Вверх
SmArs
Дата 14.5.2008, 06:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 6.2.2007

Репутация: нет
Всего: нет



Цитата(skyboy @  13.5.2008,  13:18 Найти цитируемый пост)
однако, мне кажется, что у тебя в таблице "посещения" будут данные не за один период лечения, так?

да, но их же легко обрубить по текущему месяцу.

строку "01.01;02.01;03.01;04.01" я вроде нашел как делать.
последняя дата посещения, как раз и определяется значением в поле "код", т. е. первая дата обязательно где "код=2" а последняя где=3, все записи что между ними нужны только для того чтобы взять из них даты в столбец "даты посещений"

Это сообщение отредактировал(а) SmArs - 14.5.2008, 06:32
PM MAIL   Вверх
Deniz
Дата 14.5.2008, 08:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 6
Всего: 44



Цитата(SmArs @  14.5.2008,  09:31 Найти цитируемый пост)
да, но их же легко обрубить по текущему месяцу.
не все так просто.
Варианты, которые могут присутствовать за выбранный период (неделя, месяц, квартал, год и т.д.):
1. В выбранном периоде есть код 2 и 3.
2. В выбранном периоде нет кода 2 (начало лечения не попало в период)
3. В выбранном периоде нет кода 3 (еще не закончил лечение или конец лечения не попал в период)
4. В выбранном периоде есть несколько вариантов пунктов 1, 2, 3?
Как это должно выглядеть?


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
SmArs
Дата 14.5.2008, 08:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 6.2.2007

Репутация: нет
Всего: нет



реестр делается с первого по последнее число месяца.
варианты:

Цитата(Deniz @  14.5.2008,  08:09 Найти цитируемый пост)
1. В выбранном периоде есть код 2 и 3.


Цитата(Deniz @  14.5.2008,  08:09 Найти цитируемый пост)
2. В выбранном периоде нет кода 2 (начало лечения не попало в период)

но начало (2) не раньше чем в прошлом периоде (месяце)


3. если нет кода "3", то он должен появиться в след. периоде, игнорим пока (если так и не появится, то бог с ним)

4. в выбранном периоде, должен закончится только один случай, т.е. одна "3"
PM MAIL   Вверх
Akina
Дата 14.5.2008, 10:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



Во-первых, надо бы указать используемую БД. Ибо в MySQL есть, например, group_concat, а в других БД надо извращаться.
Во-вторых, четко опишите поведение во всех возможных случаях, типа:
  • есть 2, 3
  • есть 2, нет 3
  • есть 3, нет 2
  • есть 2, 3, но 2 позже 3
  • есть несколько 2 и/или 3
  • нет ни одного из 2, 3
и во всех этих случаях - когда есть другие записи и когда их нет.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
skyboy
Дата 14.5.2008, 10:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 15
Всего: 260



Цитата(Akina @  14.5.2008,  09:00 Найти цитируемый пост)
надо бы указать используемую БД

mssql.
много думал, и склоняюсь к использованию вспомогательных таблиц.
PM MAIL   Вверх
Deniz
Дата 14.5.2008, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 6
Всего: 44



Цитата(skyboy @  14.5.2008,  13:26 Найти цитируемый пост)
много думал, и склоняюсь к использованию вспомогательных таблиц.
так еще не понятно как все это должно обрабатываться и выводиться, конечно одним select'ом не обойдешься.

Добавлено через 49 секунд
Цитата(Akina @  14.5.2008,  13:00 Найти цитируемый пост)
Во-первых, надо бы указать используемую БД
так вроде в заголовке написано MSSQL2000


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
SmArs
Дата 14.5.2008, 12:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 6.2.2007

Репутация: нет
Всего: нет



http://forum.vingrad.ru/forum/topic-190883.html  -  отсюда взял склеивание дат в одну строчку.


Цитата(Akina @  14.5.2008,  10:00 Найти цитируемый пост)
Во-вторых, четко опишите поведение во всех возможных случаях, типа:

    * есть 2, 3
    * есть 2, нет 3
    * есть 3, нет 2
    * есть 2, 3, но 2 позже 3
    * есть несколько 2 и/или 3
    * нет ни одного из 2, 3

и во всех этих случаях - когда есть другие записи и когда их нет. 


 -есть 2, 3                            -  собираем случай как в примере у меня.
 -есть 2 нет 3                      - ничего не делаем, ждем след. месяца
 -есть три нет 2                  -  если двойки нет в этом месяце и в прошлом, то вобще ничего не делаем.
 -есть 2, 3, но 2 позже 3    - это все равно что "есть 2, нет 3" и "есть 3, нет 2" - двойку не трогаем, к тройке ищем двойку в прошлом месяце, 
                                            если есть 2 то формируем случай, если нет, то ничего не делаем.
 -есть несколько 2 и/или 3  - очень редко но бывает, лучше конечно сформировать законченные случаи, но в одном месяце должен  
                                              подаваться только один случай у одного пациента, без разницы какой.  
 -нет ни одного из 2, 3       - значит пациент или не лечился в этом месяце, или начало и конец случая раскиданы в диапазоне >2 месяца, что  
                                               тоже уже не подходит
"и во всех этих случаях - когда есть другие записи"  -  записи с другими кодами относятся к своим 2 и 3, т.е. если случай законченный, сформированный, то все посещения этого пациента между 2 и 3 идут в "даты посещений". Если стоит 2 и еще нет 3 то ждем 3 и формируем, если не дождались, все игнорим. И так же если между 2 и 3 больше 2 месяцев

"и когда их нет"                 - случай формируется из 2 и 3, два посещения, всё.
база mssql2000
PM MAIL   Вверх
Akina
Дата 14.5.2008, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



Вообще я бы сделал хранимую процедуру, и всё это там прожевал...


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
SmArs
Дата 15.5.2008, 09:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 6.2.2007

Репутация: нет
Всего: нет



Я тож думаю хранимку, с парой тройкой временных таблиц, но не могу объять этого smile 
поэтому и запостил сюда
PM MAIL   Вверх
Akina
Дата 15.5.2008, 11:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



Цитата(SmArs @  15.5.2008,  10:20 Найти цитируемый пост)
не могу объять этого 

Значит, читаете все про хранимые процедуры, и начинаете учиться их писАть. Сперва самые простые, потом усложняя...


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
SmArs
Дата 15.5.2008, 11:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 6.2.2007

Репутация: нет
Всего: нет



да, дельный совет. было бы время...
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Составление SQL-запросов | Следующая тема »


 




[ Время генерации скрипта: 0.4315 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.