powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Коррелированные запросы.
9 сообщений из 9, страница 1 из 1
Коррелированные запросы.
    #37182441
UberKAKTUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Требуется выбрать количество обратившихся (count(*) as countVisits) и количество оказанных услуг (count(*) as countServices) в разрезе диагнозов (Diagnosis.diagKey).
Таблицы VisitCards (карта обратившегося пациента), Diagnosis (диагнозы) и Services (услуги) имеют поле для связи cardId.
После выполнения нижеприведенного запроса поле countServices (количество оказанных услуг) содержит сумму услуг оказанных только последней обработанной запросом карте.
Считать в несколько запросов считаю крайне неправославной затеей.
В принципе запрос справедлив также для ветки МС СКЛ, куда и планирую обратиться в случае нерезультативности текущей темы.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
SELECT ;
		Diagnosis.diagKey, count(*) as countVisits, ;
		(SELECT ;
				count(*) as countServices ;
			FROM ;
				Services ;
			WHERE ;
				Diagnosis.cardId == Services.cardId) ;
	FROM ;
		Diagnosis, VisitCards ;
	WHERE ;
		Between(VisitCards.dt_end, DTBEG, DTEND) ;
		AND Diagnosis.cardId == VisitCards.cardId ;
		AND Diagnosis.Main = .t. ;
	INTO ;
		CURSOR ServisecViaDiagnosis ;
	GROUP BY  1 
...
Рейтинг: 0 / 0
Коррелированные запросы.
    #37182477
UberKAKTUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Проблема решена вызовом sum() с третим полем в параметре. Я удаляюсь.
...
Рейтинг: 0 / 0
Коррелированные запросы.
    #37182485
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
UberKAKTUSСчитать в несколько запросов считаю крайне неправославной затеей.
В некоторых случаях MS-SQL в разы быстрее выполняет несколько запросов с сохранением промежуточного результата во временную таблицу, чем один мега-запрос с подзапросами.
...
Рейтинг: 0 / 0
Коррелированные запросы.
    #37182505
UberKAKTUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima TUberKAKTUSСчитать в несколько запросов считаю крайне неправославной затеей.
В некоторых случаях MS-SQL в разы быстрее выполняет несколько запросов с сохранением промежуточного результата во временную таблицу, чем один мега-запрос с подзапросами.Сказанное Вами вполне закономерно, однако кучка простых запросов мое самолюбие ни сколь не тешат.
...
Рейтинг: 0 / 0
Коррелированные запросы.
    #37183910
PP762
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
автор Сказанное Вами вполне закономерно, однако кучка простых запросов мое самолюбие ни сколь не тешат.

Вот по этому ты не получаешь 300 тысячь.
...
Рейтинг: 0 / 0
Коррелированные запросы.
    #37183983
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще на MS SQL это можно сделать так.
Входные данные
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
with Diagnosis as
(select  1  diagKey,  10  cardid union all
 select  2  diagKey,  20  cardid union all
 select  3  diagKey,  30  cardid union all
 select  2  diagKey,  40  cardid
),
VisitCards as
(select  10  cardid union all
 select  20  cardid union all
 select  30  cardid union all
 select  40  cardid 
),
Services as
(select  1  service,  10  cardid union all
 select  1  service,  10  cardid union all
 select  1  service,  10  cardid union all
 select  2  service,  20  cardid union all
 select  2  service,  20  cardid union all
 select  1  service,  30  cardid union all
 select  1  service,  40  cardid 
)

Запрос
Код: plaintext
1.
2.
3.
4.
select d.diagKey, count(distinct v.cardid) countVisits, count(*) countServices
from       Diagnosis  d
inner join VisitCards v on d.cardid = v.cardid
left  join Services   s on d.cardid = s.cardid
group by d.diagKey;
...
Рейтинг: 0 / 0
Коррелированные запросы.
    #37183988
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поправка
Запрос
Код: plaintext
1.
2.
3.
4.
select d.diagKey, count(distinct v.cardid) countVisits, count(s.cardid) countServices
from       Diagnosis  d
inner join VisitCards v on d.cardid = v.cardid
left  join Services   s on d.cardid = s.cardid
group by d.diagKey;
...
Рейтинг: 0 / 0
Коррелированные запросы.
    #37185361
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmKad

Подобные запросы работают только в том случае, если связь один-ко-многим есть только для одной таблицы из всех таблиц-источников. А все прочие таблицы связаны как один-к-одному. Как только, например, на одну карту окажется несколько диагнозов (на что намекает условие Diagnosis.Main = .t.), то подобные запросы начнут выдавать не корректные результаты.

В общем случае, предварительно, необходимо свести все данные к связям вида один-к-одному и только после этого выполнять объединение. А подобного можно добиться либо предварительными выборками в промежуточные хранилища (курсоры), либо подзапросами.
...
Рейтинг: 0 / 0
Коррелированные запросы.
    #37185393
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВладимирМ AmKad

(на что намекает условие Diagnosis.Main = .t.)
Ну так ведь никто не мешает автору самостоятельно внести нужные условия.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Коррелированные запросы.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]