ФОН:
Я пытался упростить работу, связанную с созданием отчета в моей программе. В последнее время мне пришлось предоставить список рабочих номеров, на которых использовался инструмент, с перечнем предметов для анализа затрат / выгод. Главным образом, чтобы увидеть, как часто инструмент используется с тех пор, как он последний раз обслуживался / калибровался, и последний раз, когда кто-либо его использовал. Я хотел интегрировать это в запрос, который помогает сгенерировать отчет - но я продолжаю разбивать своего рода кирпичную стену с количеством использований - так как я хочу, чтобы этот агрегат основывался на дате последней калибровки прибора (на основе поля в том же запросе). Я могу получить его, чтобы дать мне количество использований в общем количестве системы - но он не примет ограничение, что я хочу, чтобы он считал только время, использованное с момента последней калибровки
ПРОБЛЕМА:
Попытки добавить в мой отчет статистическую функцию для количества использований, так как калибровка элемента встречается либо с нежелательными результатами, либо со страшной ошибкой «отсутствует агрегат» (не помню точное предупреждение).
- отредактировано для добавления 8/12/2011 @ 16:09 -
Дополнительная проблема с использованием агрегата Max была обнаружена для инструментов, которые никогда не использовались, исключая этот запрос.
ПОДРОБНОСТИ:
Вот запрос, который работает до сих пор:
SELECT
dbo_tblPOGaugeDetail.intGagePOID,
dbo_tblPOGaugeDetail.strGageDetailID,
dbo_Gage_Master.Description,
dbo_Gage_Master.Manufacturer,
dbo_Gage_Master.Model_No,
dbo_Gage_Master.Gage_SN,
dbo_Gage_Master.Unit_of_Meas,
dbo_Gage_Master.User_Defined,
dbo_Gage_Master.Calibration_Frequency,
dbo_Gage_Master.Calibration_Frequency_UOM,
dbo_tblPOGaugeDetail.bolGageLeavePriceBlank,
dbo_tblPOGaugeDetail.intGageCost,
dbo_Gage_Master.Last_Calibration_Date,
dbo_Gage_Master.Next_Due_Date,
dbo_tblPOGaugeDetail.bolGageEvaluate,
dbo_tblPOGaugeDetail.bolGageExpedite,
dbo_tblPOGaugeDetail.bolGageAccredited,
dbo_tblPOGaugeDetail.bolGageCalibrate,
dbo_tblPOGaugeDetail.bolGageRepair,
dbo_tblPOGaugeDetail.bolGageReturned,
dbo_tblPOGaugeDetail.bolGageBER,
dbo_tblPOGaugeDetail.intTurnaroundDaysOut,
qryRCEquipmentLastUse.MaxOfdatDateEntered
FROM (dbo_tblPOGaugeDetail
INNER JOIN dbo_Gage_Master ON dbo_tblPOGaugeDetail.strGageDetailID = dbo_Gage_Master.Gage_ID)
INNER JOIN qryRCEquipmentLastUse ON dbo_Gage_Master.Gage_ID = qryRCEquipmentLastUse.Gage_ID
ORDER BY dbo_tblPOGaugeDetail.strGageDetailID;
Но я не могу объединить количество использований (делая Count (strCustomerJobNum)) из tblGageActivity со следующими полями:
strGageID
strCustomerJobNum
datDateEntered
datTimeEntered
Я попытался добавить поле к ранее перечисленному запросу, чтобы сделать Count (strCustomerJobNum), где datDateEntered соответствует Last_Calibration_Date из вызывающего запроса, но я получил ошибку «отсутствует агрегат». Если я пропущу это условие - оно запустится - но перечислит каждый инструмент, когда-либо отправленный, только если он имеет счетчик использования хотя бы одного (к сожалению, не того, что я хочу вообще).
Я также хочу убедиться, что если я получу ноль, использует счет - я получу ноль вместо моих ожидаемых записей минус нулевые результаты.
Я надеюсь, что кто-то там скажет мне, где я ошибаюсь, - я хочу сэкономить время, которое я сейчас трачу на запуск отчета об активности в другой программе всякий раз, когда я хочу создать этот отчет. Заранее спасибо, и дайте мне знать, если вы хотите, чтобы я опубликовал дополнительную информацию.
- отредактировано для добавления 15.08.2011 @ 14:41 -
Мне удалось решить проблему агрегации Max (), создав «чистый» запрос первого шага, чтобы получить список всех инструментов с самой современной датой как qryRCEquipmentUsed.
qryRCEquipmentLastUse
SELECT dbo.tblGageActivity.strGageID, Max(dbo.tblGageActivity.datDateEntered) AS datLastDateUsed
FROM dbo.tblGageActivity
GROUP BY dbo.tblGageActivity.strGageID;
Затем я создал «чистый» список всех инструментов, которые вообще не используются в качестве запроса с именем qryRCEquipmentNeverUsed.
qryRCEquipmentNeverUsed
SELECT dbo_Gage_Master.Gage_ID, NULL AS datLastDateUsed
FROM dbo_Gage_Master LEFT JOIN dbo_tblGageActivity ON dbo_Gage_Master.Gage_ID = dbo_tblGageActivity.strGageID
WHERE (((dbo_tblGageActivity.strGageID) Is Null));
ПРИМЕЧАНИЕ: NULL был вставлен так, что третий объединяющий запрос UNION не будет выполнен из-за несоответствия в количестве полей, извлекаемых из таблиц.
Наконец, я создал запрос UNION с именем qryCombinedUseEquipment, чтобы объединить их в список:
qryCombinedUseEquipment
SELECT *
FROM qryRCEquipmentLastUse
UNION SELECT *
FROM qryRCEquipmentNeverUsed;
Использование этого последнего запроса объединения для подачи даты последнего использования в родительский запрос работает в представлении таблицы данных, но когда родительский запрос вызывается в отчете, я получаю пустой отчет; так что толчок в правильном направлении все равно будет замечательно оценен.
ПРИЛОЖЕНИЕ
Тот же сценарий, что и выше, но с более короткими псевдонимами таблиц (в случае, если кто-то найдет это более понятным):
SELECT
gd.intGagePOID,
gd.strGageDetailID,
gm.Description,
gm.Manufacturer,
gm.Model_No,
gm.Gage_SN,
gm.Unit_of_Meas,
gm.User_Defined,
gm.Calibration_Frequency,
gm.Calibration_Frequency_UOM,
gd.bolGageLeavePriceBlank,
gd.intGageCost,
gm.Last_Calibration_Date,
gm.Next_Due_Date,
gd.bolGageEvaluate,
gd.bolGageExpedite,
gd.bolGageAccredited,
gd.bolGageCalibrate,
gd.bolGageRepair,
gd.bolGageReturned,
gd.bolGageBER,
gd.intTurnaroundDaysOut,
lu.MaxOfdatDateEntered
FROM (dbo_tblPOGaugeDetail gd
INNER JOIN dbo_Gage_Master gm ON gd.strGageDetailID = gm.Gage_ID)
INNER JOIN qryRCEquipmentLastUse lu ON gm.Gage_ID = lu.Gage_ID
ORDER BY gd.strGageDetailID;