Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 31.07.2011, 23:13   #1
silent_lab
Пользователь
 
Регистрация: 16.06.2009
Сообщений: 36
Вопрос COUNT с условием или как правильно построить запрос

Добрый день просьба помочь !

Есть две таблицы maps и procedur БД ACEESS . id_proc и id_procedur связаные таблицы

Код:
procedur :
id_proc	name_proc
1	 	Эзофагоскопия диагностическая
2		Эзофагоскопия лечебная
3		Эзофагогастроскопия диагностическая
4		Эзофагогастроскопия лечебная
5		Эзофагогастродуоденоскопия диагностическая
6		Эзофагогастродуоденоскопия лечебная
7		Эзофагогастродуоденоскопия диаг. Детям
8       	Эзофагогастродуоденоскопия лечебная детям
9		Ресктосигмоидоскопия диагностическая
10		Ресктосигмоидоскопия лечебная
11		Фибробронхоскопия лечебная
12		Опред. Хеликобактера при ЭГДС
13		Колоноскопия диагностическая
14		Колоноскопия лечебная

maps :
id_map	date_p	         id_procedur			id_financ
1	       18.07.2011	       1	    	            1
2	       18.07.2011	       1	     	            1
3	       18.07.2011	       9	      	            2
4	       18.07.2011	      13	      	            1
5	       18.07.2011	      13	     	            2
6	       18.07.2011	      11	     	   	    2
7	       19.10.2011	       9	      	            2
8	       18.07.2011	       10	      	            2
9	       18.07.2011	      14	     	            3
мне нужно запросом сформировать таблицу для отчета.
первым полем был список процедур с названием ( список процедур должен быть полным) и 3 дополнительных поля Бюджет и Платная и ИТОГО в процедурах где не будет значений должни быть 0

Вот пробовал сделать так:

Код:
Select name_proc, Count (id_procedur),id_procedur,Count (id_financ) as Итого
 From ( procedur p LEFT JOIN maps m ON  m.id_procedur = p.id_proc)
Group by  name_proc, id_procedur
но как мне сделать Бюджет и Платно не знаю......
Лоло в том что в поле id_financ храняться значения 1, 2, или 3 .
1 - это означает Бюджет
2- платно
3 - частично платно

мне нужно к этому запросу добавить еще поля Бюджет и Платно, но как в COUNT сделать проверку условия не знаю, вернее пробовал по разному не вышло.....
Помогите разобраться...

Представлял себе запрос но как реализовать не знаю

Код:
Select name_proc, Count (id_procedur),id_procedur, Count ( усли ....id_financ = 1..) as Бюджет, Count ( усли ....id_financ = 2 ....AND ...id_financ = 2...) as Платно,, Count (id_financ) as Итого
 From ( procedur p LEFT JOIN maps m ON  m.id_procedur = p.id_proc)
Group by  name_proc, id_procedur
Может будут другие предложения ...

Последний раз редактировалось silent_lab; 31.07.2011 в 23:20. Причина: изменение текста
silent_lab вне форума Ответить с цитированием
Старый 01.08.2011, 00:25   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Код:
SELECT P.name_proc,
    SUM(CASE WHEN M.id_financ=1 THEN 1 ELSE 0 END) AS Бюджет,
    SUM(CASE WHEN M.id_financ=2 THEN 1 ELSE 0 END) AS Платная,
    SUM(CASE WHEN M.id_financ IS NOT NULL THEN 1 ELSE 0 END) AS ИТОГО
  FROM procedur P
    LEFT JOIN maps M ON M.id_procedur=P.id_proc
  GROUP BY P.name_proc
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 01.08.2011, 09:08   #3
silent_lab
Пользователь
 
Регистрация: 16.06.2009
Сообщений: 36
По умолчанию

Выдал сообщение - НЕОПОЗНАННАЯ ОШИБКА ! - программу пишу в Delphi

Я находил примеры , похожие, но все равно не заработало выдавал такое же сообщение.
Может потому что DB Access

А если запрос выполнить напрямую в Access то выдает сообщение об ошибке :
Ошибка синтаксиса (пропущен оператор) в выражении запроса 'SUM(CASE WHEN maps.id_financ=1 THEN 1 ELSE 0 END)'

Последний раз редактировалось silent_lab; 01.08.2011 в 09:19.
silent_lab вне форума Ответить с цитированием
Старый 01.08.2011, 10:17   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

в MS Access не поддерживается CASE в запросах.
вместо него попробуйте использовать IIF
Код:
SELECT P.name_proc,
    SUM(IIF(M.id_financ=1;1;0)) AS Бюджет,
    SUM(IIF(M.id_financ=2;1;0)) AS Платная,
    SUM(IIF(M.id_financ IS NOT NULL;1;0)) AS ИТОГО
  FROM procedur P
    LEFT JOIN maps M ON M.id_procedur=P.id_proc
  GROUP BY P.name_proc
Цитата:
Выдал сообщение - НЕОПОЗНАННАЯ ОШИБКА ! - программу пишу в Delphi
дык, сначала запустите Access, создайте там запрос, вставьте текст запроса, убедитесь, что он работает,
потом уже вставляйте данный текст запроса в Delphi.
Delphi же сам запрос не выполняет - отдаёт его на выполнение СУБД...

Последний раз редактировалось Serge_Bliznykov; 01.08.2011 в 10:23.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 01.08.2011, 10:24   #5
silent_lab
Пользователь
 
Регистрация: 16.06.2009
Сообщений: 36
По умолчанию

Также выдал ошибку - ошибка синтаксиса в выражении запроса 'SUM(IIF(M.id_financ=1;1;0))'

Не знаю уже что и думать ........... может БД менять но это сейчас не выход, планируется через год перейти на MSSQL server.
Но пока на Access
silent_lab вне форума Ответить с цитированием
Старый 01.08.2011, 10:31   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Код:
'SUM(IIF(M.id_financ=1;1;0))'
ну, попробуйте вместо точек с запятой запятые..
я по памяти писал, мог и ошибиться!

так:
Код:
SUM(IIF(M.id_financ=1,1,0))
Serge_Bliznykov вне форума Ответить с цитированием
Старый 01.08.2011, 10:33   #7
silent_lab
Пользователь
 
Регистрация: 16.06.2009
Сообщений: 36
По умолчанию

Ураааа заработало ))))))))))))))))))))))

Цитата:
Код:
Serge_Bliznykov

SELECT P.name_proc,
    SUM(IIF(M.id_financ=1;1;0)) AS Бюджет,
    SUM(IIF(M.id_financ=2;1;0)) AS Платная,
    SUM(IIF(M.id_financ IS NOT NULL;1;0)) AS ИТОГО
  FROM procedur P
    LEFT JOIN maps M ON M.id_procedur=P.id_proc
  GROUP BY P.name_proc
только заработала после того как ВМЕСТО ; поставил ,

То есть вот так :

Код:
SELECT P.name_proc,
    SUM(IIF(M.id_financ=1,1,0)) AS Бюджет,
    SUM(IIF(M.id_financ=2,1,0)) AS Платная,
    SUM(IIF(M.id_financ IS NOT NULL,1,0)) AS ИТОГО
  FROM procedur P
    LEFT JOIN maps M ON M.id_procedur=P.id_proc
  GROUP BY P.name_proc
Всем большое спасибо ..... И еще хотелость спросить Как в этот запрос добавить выбор по датам ?
silent_lab вне форума Ответить с цитированием
Старый 01.08.2011, 10:46   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Пожалуйста.
Только это спасибо в основном относится к Аватар - ибо разработка запроса была его. я так, технически заменил одну конструкцию на другую...

Цитата:
И еще хотелость спросить Как в этот запрос добавить выбор по датам ?
Это что означает?
По каждой дате отдельные цифры с количеством хотите увидеть?
так это элементарно! Просто добавьте дату в запрос и в список группируемых полей:
Код:
SELECT P.name_proc, M.date_p, 
    SUM(IIF(M.id_financ=1,1,0)) AS Бюджет,
    SUM(IIF(M.id_financ=2,1,0)) AS Платная,
    SUM(IIF(M.id_financ IS NOT NULL,1,0)) AS ИТОГО
  FROM procedur P
    LEFT JOIN maps M ON M.id_procedur=P.id_proc
  GROUP BY P.name_proc, M.date_p
Serge_Bliznykov вне форума Ответить с цитированием
Старый 01.08.2011, 10:56   #9
silent_lab
Пользователь
 
Регистрация: 16.06.2009
Сообщений: 36
По умолчанию

нет не группировка по дате, отчет создается раз в месяц, и так он выдаст за все месяцы, а нужно данные за 1 , если брать из примера то 18.07.2011.
может ка кто так :

Код:
SELECT P.name_proc,
    SUM(IIF(M.id_financ = 1,1,0)) AS Бюджет,
    SUM(IIF(M.id_financ=2,1,0)) AS Платная,
    SUM(IIF(M.id_financ IS NOT NULL,1,0)) AS ИТОГО,
   SUM(IIF(M.id_financ = 1,1,0))*60 AS БюджетS,
    SUM(IIF(M.id_financ=2,1,0))*55 AS ПлатнаяS,
    SUM(IIF(M.id_financ IS NOT NULL,1,0)) AS ИТОГОS
  FROM procedur P
    LEFT JOIN (Select * from maps where (((maps.date_p)=#26.07.2011#))) as maps M ON M.id_procedur=P.id_proc
  GROUP BY P.name_proc
но наверно неправильно у меня не работает, и еще как посчитать Sum БюджетS,ПлатнаяS.......

Как посчитать разобрался получилось вот как , а вот как выборку по датам сделать не знаю :
Код:
SELECT P.name_proc,
    SUM(IIF(maps.id_financ = 1,1,0)) AS Бюджет,
    SUM(IIF(maps.id_financ=2,1,0)) AS Платная,
    SUM(IIF(maps.id_financ IS NOT NULL,1,0)) AS ИТОГО,
   SUM(IIF(maps.id_financ = 1,1,0))*60 AS БюджетS,
    SUM(IIF(maps.id_financ=2,1,0))*55 AS ПлатнаяS,
    SUM(IIF(maps.id_financ IS NOT NULL,((IIF(maps.id_financ = 1,1,0))*60 +(IIF(maps.id_financ=2,1,0))*55),0)) AS ИТОГОS
  FROM procedur P
    LEFT JOIN maps  ON maps.id_procedur=P.id_proc
  GROUP BY P.name_proc
он мне выдает ошибку в этом если по дате делать:
Код:
LEFT JOIN (Select * from maps where (((maps.date_p)=#26.07.2011#))) as maps M ON M.id_procedur=P.id_proc
и так тоже
Код:
LEFT JOIN (Select * from maps where (date_p=#26.07.2011#)) as maps ON maps.id_procedur=P.id_proc

Последний раз редактировалось Stilet; 01.08.2011 в 14:52.
silent_lab вне форума Ответить с цитированием
Старый 01.08.2011, 11:19   #10
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Уточните - в Бюджет, Платная, ИТОГО нужно данные за конкретное число, а в БюджетS, ПлатнаяS, ИТОГОS - за месяц? Или нечто другое? И зачем умножение на 60, 55?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как правильно построить ER диаграмму dymych Помощь студентам 1 29.01.2010 10:43
Как правильно построить базу данных на таблицах, пересекающих по полям touchka Microsoft Office Access 5 27.12.2009 18:43
Как правильно построить индексы? Olga_3005 SQL, базы данных 1 04.09.2009 23:02
посоветуйте как правильно построить график vakyla Общие вопросы Delphi 11 31.03.2009 08:12
Как правильно построить цикл для выборки? Tanuska___:) БД в Delphi 1 12.01.2009 14:50