![]() |
|
Модераторы: skyboy |
![]()
|
|
| SmArs |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 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 | Я конечно догадываюсь, что одним запросом тут не обойтись, но все же можно ли хоть как нибудь приблизить к нужному виду эту картину? |
|||
|
||||
| skyboy |
|
|||
|
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 15 Всего: 260 |
т.е. выбрать все посещения, где дата посещения лежит между датой начала лечения и датой конца лечения в таблице "после колдунства"?
|
|||
|
||||
| SmArs |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 25 Регистрация: 6.2.2007 Репутация: нет Всего: нет |
после колдунства - это как должно получиться в итоге, а эти две даты определяются цифрами в поле "код", 2 - дата начала, 3-дата окончания. А все что между ними и они сами должны быть перечислены в формате "дд.мм" в поле "даты посещений".
|
|||
|
||||
| skyboy |
|
|||
|
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 15 Всего: 260 |
однако, мне кажется, что у тебя в таблице "посещения" будут данные не за один период лечения, так? кроме того, строку "01.01;02.01;03.01;04.01" в mysql легко получить операторо group_concat, а вот в mssql я подобной конструкции не знаю. может, вообще невозможно. в результате поле "код лечения" соотвествует полю "код лечения" в записи с максимальной датой посещения? |
|||
|
||||
| SmArs |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 25 Регистрация: 6.2.2007 Репутация: нет Всего: нет |
да, но их же легко обрубить по текущему месяцу. строку "01.01;02.01;03.01;04.01" я вроде нашел как делать. последняя дата посещения, как раз и определяется значением в поле "код", т. е. первая дата обязательно где "код=2" а последняя где=3, все записи что между ними нужны только для того чтобы взять из них даты в столбец "даты посещений" Это сообщение отредактировал(а) SmArs - 14.5.2008, 06:32 |
|||
|
||||
| Deniz |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1251 Регистрация: 16.10.2004 Где: Новый Уренгой Репутация: 6 Всего: 44 |
не все так просто.
Варианты, которые могут присутствовать за выбранный период (неделя, месяц, квартал, год и т.д.): 1. В выбранном периоде есть код 2 и 3. 2. В выбранном периоде нет кода 2 (начало лечения не попало в период) 3. В выбранном периоде нет кода 3 (еще не закончил лечение или конец лечения не попал в период) 4. В выбранном периоде есть несколько вариантов пунктов 1, 2, 3? Как это должно выглядеть? -------------------- "Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с) |
|||
|
||||
| SmArs |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 25 Регистрация: 6.2.2007 Репутация: нет Всего: нет |
реестр делается с первого по последнее число месяца.
варианты:
но начало (2) не раньше чем в прошлом периоде (месяце) 3. если нет кода "3", то он должен появиться в след. периоде, игнорим пока (если так и не появится, то бог с ним) 4. в выбранном периоде, должен закончится только один случай, т.е. одна "3" |
|||
|
||||
| Akina |
|
|||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 45 Всего: 454 |
Во-первых, надо бы указать используемую БД. Ибо в MySQL есть, например, group_concat, а в других БД надо извращаться.
Во-вторых, четко опишите поведение во всех возможных случаях, типа:
-------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
| skyboy |
|
|||
|
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 15 Всего: 260 |
||||
|
||||
| Deniz |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1251 Регистрация: 16.10.2004 Где: Новый Уренгой Репутация: 6 Всего: 44 |
так еще не понятно как все это должно обрабатываться и выводиться, конечно одним select'ом не обойдешься.
Добавлено через 49 секунд так вроде в заголовке написано MSSQL2000 -------------------- "Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с) |
|||
|
||||
| SmArs |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 25 Регистрация: 6.2.2007 Репутация: нет Всего: нет |
http://forum.vingrad.ru/forum/topic-190883.html - отсюда взял склеивание дат в одну строчку.
-есть 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 |
|||
|
||||
| Akina |
|
|||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 45 Всего: 454 |
Вообще я бы сделал хранимую процедуру, и всё это там прожевал...
-------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
| SmArs |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 25 Регистрация: 6.2.2007 Репутация: нет Всего: нет |
Я тож думаю хранимку, с парой тройкой временных таблиц, но не могу объять этого
поэтому и запостил сюда |
|||
|
||||
| Akina |
|
|||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 45 Всего: 454 |
Значит, читаете все про хранимые процедуры, и начинаете учиться их писАть. Сперва самые простые, потом усложняя... -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
| SmArs |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 25 Регистрация: 6.2.2007 Репутация: нет Всего: нет |
да, дельный совет. было бы время...
|
|||
|
||||
![]()
|
| 1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Составление SQL-запросов | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |