GOOGLE ADS

пятница, 15 апреля 2022 г.

Соединение нескольких запросов и передача критериев из одного запроса в другой

Я пытаюсь составить запрос, который в основном будет запускать другой запрос при каждом возврате.

Мой текущий запрос собирает важную информацию для каждого клиента, например, сколько времени в среднем занимает жених и описание типа стрижки, которую он делает:

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;

Комментариев нет:

Отправить комментарий

Laravel Datatable addColumn returns ID of one record only

Я пытаюсь использовать Yajra Datatable для интеграции DataTable на свой веб-сайт. Я смог отобразить таблицу, но столкнулся с проблемой. В по...