Я пытаюсь составить запрос, который в основном будет запускать другой запрос при каждом возврате.
Мой текущий запрос собирает важную информацию для каждого клиента, например, сколько времени в среднем занимает жених и описание типа стрижки, которую он делает:
SELECT Query11.petId AS PetID,
Query11.petName AS PetName,
dbo_Customer.cstLName AS LastName,
Query11.lstValue AS Breed,
qryFindsPetAvgApptTime.TotalAppts,
dbo_vwPetGroom.pgrName AS GroomStyle,
dbo_ListValues.lstValue AS Haircut,
ROUND([AvgPTime]) AS AvgPrep,
ROUND([AvgBTime]) AS AvgBath,
ROUND([AvgDTime]) AS AvgDry,
ROUND([AvgGTime]) AS AvgGroom,
[AvgPrep] + [AvgBath] + [AvgDry] + [AvgGroom] AS AvgMinutes,
qryFindsPetAvgApptTime.AvgHours
FROM((Query11
LEFT JOIN qryFindsPetAvgApptTime ON Query11.petId = qryFindsPetAvgApptTime.PetID)
LEFT JOIN dbo_Customer ON Query11.petCustId = dbo_Customer.cstId)
LEFT JOIN (dbo_vwPetGroom
LEFT JOIN dbo_ListValues ON dbo_vwPetGroom.pgrLengthHairBodyLid = dbo_ListValues.lstId)
ON Query11.petId = dbo_vwPetGroom.pgrPetId;
Я хочу добавить среднюю длину между приложениями для ухода за приведенной выше информацией о запросе. Прямо сейчас это делается в 2 отдельных запросах. Первый тянет дни между приложениями:
SELECT tblTimeLog.PetID,
tblTimeLog.PetName,
[ApptDate] - (SELECT MAX(T.ApptDate)
FROM tblTimeLog T
WHERE T.PetID = tblTimeLog.PetID
AND T.ApptDate < tblTimeLog.ApptDate) AS Diff,
tblTimeLog.ApptDate
FROM tblTimeLog
WHERE (((tblTimeLog.PetID) = [Enter PetID]))
ORDER BY tblTimeLog.ApptDate;
А затем усреднил это:
SELECT qryTimeLogDiffs.PetID,
qryTimeLogDiffs.PetName,
AVG(qryTimeLogDiffs.Diff) AS AvgOfDiff
FROM qryTimeLogDiffs
GROUP BY qryTimeLogDiffs.PetID,
qryTimeLogDiffs.PetName;
Есть ли способ передать критерии PetID из каждого возврата во второй запрос, чтобы он добавил средний интервал между приложениями к информации в первом запросе??
Решение проблемы
Рассмотрите возможность рефакторинга второго запроса, чтобы избежать утомительного подзапроса с коррелированными сводными данными. Один из подходов включает в себя сначала выполнение агрегированного запроса на основе самосоединения, чтобы вернуть дату последней встречи для каждого PetID.
Еще лучше превратить этот запрос в запрос действия, чтобы заполнить временную таблицу либо запросом создания таблицы, как показано ниже, используя INTOили регулярно очищая постоянную таблицу с помощью запроса удаления и вставки-выбора:
SELECT curr.PetID,
curr.PetName,
curr.ApptDate,
MAX(prev.[AppDate]) AS MaxPrevDate
INTO lastApptTimeLog
FROM tblTimeLog AS curr
INNER JOIN tblTimeLog AS prev
ON curr.PetID = prev.PetID
WHERE prev.ApptDate < curr.AppDate
GROUP BY curr.PetID,
curr.PetName,
curr.ApptDate;
Затем создайте третий агрегированный запрос на основе этой временной таблицы и запустите вычисление разницы. Наконец, включите этот запрос в первый запрос.
SELECT PetID,
PetName,
AVG(ApptDate - MaxPrevDate) AS AvgOfDiff
FROM lastApptTimeLog
GROUP BY PetID,
PetName;
Комментариев нет:
Отправить комментарий