Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Запрос к БД. Кол-во записей за несколько месяцев. за неск. мес-ев, причём каждый отдельно 
:(
    Опции темы
Nikolja
Дата 20.6.2010, 19:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 24.2.2009
Где: Черкассы

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



Здравствуйте, форумчане и замечательный форум Vingrad!  smile 
Здесь, на форуме, есть что почитать, но ПИШУ я сюда редко. 
(Не писатель, а читатель, однако)  smile 

Базы данных – дело для меня то ли новое, то ли хорошо забытое старое.
Надеюсь, что для людей, занимающихся этим делом постоянно, ответить на следующий вопрос не составит труда.

Есть некий диагностический центр и его база данных. БД – локальная, Парадокс, Delphi. 
Идентификаторы я напишу по-русски, русскими буквами. Возможно, так скорее и проще будет понятна суть вопроса.

Каждый день в диагностический центр обращаются клиенты/пациенты, направленные туда из РАЗНЫХ БОЛЬНИЦ и прочих лечебных заведений. В БД заносится разная информация по каждому клиенту. В том числе и — из какой больницы он направлен.

-----------------------------------------------------------------------------

Таблица Основная.db

Поля:

Фамилия_пациента
Имя
Отчество
Дата_приёма
Название_больницы

другие, к делу не относящиеся, поля.

-----------------------------------------------------------------------------

СУТЬ ДЕЛА: 

Нужен отчёт, где
1) Список из названий больниц, откуда пришли клиенты
2) Сколько пришло из каждой больницы пациентов за месяц
3) Сколько за каждый из выбранных 4-х месяцев.

Например:

Название больницы     Январь   Февраль   Март   Апрель
-----------------------------------------------------------
1-ая город. больница    5         7        8        3
2-ая город. больница    10        5        7        15
Областная больница      20        12       11       21

и т.п.

----------------------------------------------------------


Как это сделать? С помощью SQL или, может быть, как-нибудь средствами Delphi можно?

Допустим, чтобы выбрать данные за 1 месяц, (например, за январь) я написал такой запрос (идентификаторы, для понятности, ЗДЕСЬ на русском):

Код

SELECT Название_больницы, COUNT(Название_больницы)
FROM Основная.db
WHERE (Дата_приёма BETWEEN "1.01.10" AND "31.01.10")
GROUP BY Название_больницы


А как за 4 месяца? 
и чтобы количество за каждый месяц в отдельной колонке, как в табличке выше?


И ЕЩЁ ВОПРОС:

Можно ли задать условие так, чтобы задавать в запросе только нужный месяц, а не диапазон с первого по последнее число месяца
Чтобы пользователь не вспоминал, сколько дней в январе, сколько в феврале, а сколько в марте?
PM MAIL   Вверх
Keeper89
Дата 20.6.2010, 20:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Какие еще есть таблицы (список пациентов, список больниц и т.д.)?
Насколько я понимаю, для решении данных задач достаточно 3-х таблиц: клиенты, больницы и сводная (типа той, что приведена).

Это сообщение отредактировал(а) Keeper89 - 20.6.2010, 21:02


--------------------
PM MAIL WWW   Вверх
chip_and_dayl
Дата 20.6.2010, 21:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 603
Регистрация: 22.4.2007
Где: Украина, Киев

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



Цитата(Nikolja @  20.6.2010,  19:43 Найти цитируемый пост)
А как за 4 месяца?

Также как и за 1 месяцsmile


Цитата(Nikolja @  20.6.2010,  19:43 Найти цитируемый пост)
Можно ли задать условие так, чтобы задавать в запросе только нужный месяц, а не диапазон с первого по последнее число месяца? 

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

Добавлено через 2 минуты и 31 секунду
Да, правда чтобы результат был в виде, что выше нужно подумать

Добавлено через 4 минуты и 23 секунды
Что за база!?!
На сколько я знаю, то есть в скл ф-ции которые отделяют от даты месяц, год и т.д. Тогда можно по им группировать


--------------------
Фсё будет хорошо!!!
PM MAIL Skype   Вверх
Nikolja
Дата 21.6.2010, 13:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 24.2.2009
Где: Черкассы

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



Цитата(Keeper89 @ 20.6.2010,  20:59)
Какие еще есть таблицы (список пациентов, список больниц и т.д.)?
Насколько я понимаю, для решении данных задач достаточно 3-х таблиц: клиенты, больницы и сводная (типа той, что приведена).

Вся основная инфа, как раз в той таблице, под названием ~ Основная.bd. Если угодно -- Osnovna.bd
Есть ещё таблица со списком лечебных заведений. 

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

Добавлено @ 13:56
Цитата(chip_and_dayl @ 20.6.2010,  21:03)
Цитата(Nikolja @  20.6.2010,  19:43 Найти цитируемый пост)
А как за 4 месяца?

Также как и за 1 месяцsmile

А поконкретнее можно, если знаете? Тут ведь, по идее, несколько строчек кода...
Я же именно об этом и спрашиваю, -- т.е. понимаю, что это где-то близко к тому, что выше написано -- но не соображу КАК именно! 

Отвечаю на другие вопросы:
Как уже было сказано: БД -- несколько таблиц на Парадоксе, интерфейс -- на Delphi.


Это сообщение отредактировал(а) Nikolja - 21.6.2010, 14:02
PM MAIL   Вверх
Nikolja
Дата 21.6.2010, 14:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 24.2.2009
Где: Черкассы

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



Цитата(chip_and_dayl @ 20.6.2010,  21:03)
На сколько я знаю, то есть в скл ф-ции которые отделяют от даты месяц, год и т.д. Тогда можно по им группировать

Опять-таки - а конкретнее? Программирование -- всё-таки более-менее точная техническая наука, хоть и творческая... smile 

В Delphi, к примеру, есть ф-ция DecodeDate(), которая разделяет дату на несколько беззнаковых целых (тип word)... Год, месяц, день...
PM MAIL   Вверх
chip_and_dayl
Дата 21.6.2010, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 603
Регистрация: 22.4.2007
Где: Украина, Киев

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



Заставили в гугл лезть.

Код

select Count(*), YEAR(bDate) as mDate  from BPR_A
group by YEAR(bDate)


Такое в Аксесе прокатило. Что с Парадоксом будет я не знаюsmile

Добавлено через 1 минуту и 1 секунду
Результат
2007     1258
2008     2589

Вместо Yera используете Month


--------------------
Фсё будет хорошо!!!
PM MAIL Skype   Вверх
Nikolja
Дата 23.6.2010, 16:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 24.2.2009
Где: Черкассы

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



To chip_and_dayl
Спасибо за помощь!

Натолкнули на поиск в нужном направлении. 
Плюс вам в репутацию за совет! +1 . Нет... постов у меня маловато на этом форуме, говорит техника... надо больше ста, чтобы влиять на репутацию. Ну, буду должен.

Правда, ваш код, тот что выше, в ДАННОМ случае, не работает, но благодаря ему я СУТЬ решения понял.
Ответ нашёл в Помощи к Delphi, раздел "Local SQL".

Итак, на ОДИН вопрос ответ уже есть. Вот он.

Чтобы задавать в запросе только нужный МЕСЯЦ, а не диапазон с первого по последнее число месяца
надо использовать функцию EXTRACT().


В данном случае EXTRACT(MONTH ...).

Например, выделим из поля с датой (приёма) Data_prijoma год, месяц и день.
Это делается так.

Код

SELECT Data_prijoma, 
       EXTRACT(YEAR FROM Data_prijoma) AS God,
       EXTRACT(MONTH FROM Data_prijoma) AS Mesjac,
       EXTRACT(DAY FROM Data_prijoma) AS Denj 
FROM Osnovna


А вот так задаётся УСЛОВИЕ - 
например, выбрать записи, где Дата приёма - май, т.е. 5-ый месяц.


(Прим. "Назва лікарні" - укр. "название больницы",
а "месяц" и "день" выше я написал на такой югославско-хорватский манер - "mesjac', "denj". 
Их "j" - это наше "й" или "ь".)

Код

SELECT Nazva_likarni, COUNT(Nazva_likarni)
FROM Osnovna.db
WHERE (EXTRACT(MONTH FROM Data_prijoma) = 5)
GROUP BY Nazva_likarni


НО! 
Остаётся ОСНОВНОЙ вопрос! 
Как изменить тот запрос, что написан выше (последний запрос), чтобы он выводил информацию за несколько месяцев, и за каждый месяц в отдельной колонке?


Получается, что к каждому столбику отдельное условие, что ли?

Переформулирую запрос попроще, русским языком. 
Нам надо вывести информацию за 4 месяца (например, январь, февраль, март, апрель), где:

1-ый столбик -- список Названий_больниц (откуда пришли клиенты/пациенты). Это сделать просто -- SELECT Название_больницы.
2-ой столбик -- Кол-во Названий_больниц, ГДЕ Дата_приёма = январь. С этим тоже уже разобрались.

Пока непонятно следующее. Как же переписать запрос, чтобы он выводил ещё и такую инф-ию? :

3-ий столбик -- Кол-во Названий_больниц, ГДЕ Дата_приёма = февраль
4-ый столбик -- Кол-во Названий_больниц, ГДЕ Дата_приёма = март
5-ый столбик -- Кол-во Названий_больниц, ГДЕ Дата_приёма = апрель
PM MAIL   Вверх
chip_and_dayl
Дата 23.6.2010, 17:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 603
Регистрация: 22.4.2007
Где: Украина, Киев

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



Почти, но не все в моем примере доглядели smile
Код

SELECT Nazva_likarni, COUNT(Nazva_likarni), EXTRACT(MONTH FROM Data_prijoma)
FROM Osnovna.db
where data_prijoma>='01.01.2010' and data_prijoma<='01.10.2010'    
GROUP BY Nazva_likarni, EXTRACT(MONTH FROM Data_prijoma)


Начало и конец даты лучше передавать через параметры

Результатом по идеи должно быть следующее:

Бол. Святая Мария    февраль    158
Бол. Святая Мария     март         178

Бол. Святой Петр      февраль    358
Бол. Святой Петр      март          258

Чтобы результат был в том виде, как у вас, то нужно или использовать специальный компонент для отображения таблиц, или думать как это можно реализовать с помощью запроса


--------------------
Фсё будет хорошо!!!
PM MAIL Skype   Вверх
Nikolja
Дата 29.6.2010, 13:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 24.2.2009
Где: Черкассы

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



GROUP BY Nazva_likarni, EXTRACT(MONTH FROM Data_prijoma)

такое не работает.
PM MAIL   Вверх
Akella
Дата 29.6.2010, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


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

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



почему?
PM MAIL   Вверх
chip_and_dayl
Дата 29.6.2010, 14:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 603
Регистрация: 22.4.2007
Где: Украина, Киев

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



Nikolja
Хоть ошибку скажите:)


--------------------
Фсё будет хорошо!!!
PM MAIL Skype   Вверх
Akella
Дата 29.6.2010, 16:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


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

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



Зачем? Он ждёт телепатов!
PM MAIL   Вверх
chip_and_dayl
Дата 29.6.2010, 16:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 603
Регистрация: 22.4.2007
Где: Украина, Киев

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



В принципе я телепатом подрабатываю, но в четверг, а сегодня вторник, так что ждем автора или четверга :)


--------------------
Фсё будет хорошо!!!
PM MAIL Skype   Вверх
Nikolja
Дата 30.6.2010, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 24.2.2009
Где: Черкассы

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



Цитата(Akella @ 29.6.2010,  14:43)
почему?

 smile Самому интересно, почему?! smile 

Я запросы проверяю в SQL Explorer`e. Так ОН говорит что-то в таком роде - не поддерживаются выражения в GROUP BY.
Не верите  smile  - проверьте. Я так обычно, в спорных случаях и делаю. 
Можно очень быстро создать такую несложную табличку, как выше. Например, в Database Desktop`e. 

Там всего-то и надо полей для данной задачи:
Название больницы - символьное
Дата приёма - дата

И несколько записей сочинить, чтобы было из чего выбирать.
PM MAIL   Вверх
Nikolja
Дата 1.7.2010, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 24.2.2009
Где: Черкассы

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



Цитата(chip_and_dayl @ 29.6.2010,  16:37)
В принципе я телепатом подрабатываю, но в четверг, а сегодня вторник, так что ждем автора или четверга smile

 smile Вот он и ЧЕТВЕРГ.

Как говорят французы, пардон. У меня именно сейчас, к сожалению, сложности с доступом к Интернету. Поэтому так выходит, что я пишу коротко и редко. 

И, хуже того, программа (по которой возникли вопросы)  - у меня на одном компе, а в Интернет приходится выходить с другого.

2 chip_and_dayl

Спасибо за совет. Это, в принципе, тоже вариант решения.

Цитата
не все в моем примере доглядели smile

Увидел ваш совет сразу. И попробовал.
НО - такая группировка - сначала по Названию, а потом по Дате, работает, к сожалению, только когда Дата - полная.

Может быть, я где-то ошибаюсь, но я попробовал в разных вариациях группировать по выделенному из даты месяцу - не получается! 

Ничего! Зато я из-за этого запроса основательно SQL вспомнил и повторил! 
А то, как говорится, волею случая, мне несколько лет ничем связанным с базами данных заниматься не приходилось. А оно забывается.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




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


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

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