Access & SQL Server: количество использований с момента проблемы с агрегированием даты - новая проблема с отчетностью (решена проблема с агрегированием) - PullRequest
0 голосов
/ 12 августа 2011

ФОН:
Я пытался упростить работу, связанную с созданием отчета в моей программе. В последнее время мне пришлось предоставить список рабочих номеров, на которых использовался инструмент, с перечнем предметов для анализа затрат / выгод. Главным образом, чтобы увидеть, как часто инструмент используется с тех пор, как он последний раз обслуживался / калибровался, и последний раз, когда кто-либо его использовал. Я хотел интегрировать это в запрос, который помогает сгенерировать отчет - но я продолжаю разбивать своего рода кирпичную стену с количеством использований - так как я хочу, чтобы этот агрегат основывался на дате последней калибровки прибора (на основе поля в том же запросе). Я могу получить его, чтобы дать мне количество использований в общем количестве системы - но он не примет ограничение, что я хочу, чтобы он считал только время, использованное с момента последней калибровки

ПРОБЛЕМА:
Попытки добавить в мой отчет статистическую функцию для количества использований, так как калибровка элемента встречается либо с нежелательными результатами, либо со страшной ошибкой «отсутствует агрегат» (не помню точное предупреждение).

- отредактировано для добавления 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;

Ответы [ 3 ]

1 голос
/ 12 августа 2011

Кусочек за кусочком ...

Сначала - я подозреваю, что вы пытаетесь ответить на слишком много вопросов одновременно (о чем свидетельствует 23 поля в вашем SELECT), что сделает агрегацию практически невозможной.Начните с сужения области действия запроса. На какой вопрос пытается ответить этот запрос?(Вы всегда можете сделать больше запросов, чтобы ответить на другие вопросы ...: -)

1) Сколько использовалось с момента последней калибровки?2) Сколько использований с прошлого ... использования ?(не уверен, что вы подразумеваете под этим - может быть, последний выход из системы или последняя аренда, и т. д.?) - 1007 *

Совет - научитесь использовать псевдонимы таблиц.Большие запросы трудно читать;хуже из-за повторяющихся имен таблиц.

1) Пример: dbo_tbl_POGaugeDetail.intGagePOID становится d.intGagePOID

Вот пример, который может помочь вам начать:

SELECT
   d.strCustomerJobNum,
   Max(d.last_calibration_date) -- not sure what you named that field
   Count(d.strCustomerJobNum)
FROM
   dbo_tblPOGaugeDetail d
GROUP BY
   d.strCustomerJobNum
1 голос
/ 12 августа 2011

Работает ли это:

    SELECT dbo_tblPOGaugeDetail.intGagePOID, dbo_tblPOGaugeDetail.strGageDetailID, 

        OuterGageMaster.Description, OuterGageMaster.Manufacturer,   OuterGageMaster.Model_No, 

        OuterGageMaster.Gage_SN, OuterGageMaster.Unit_of_Meas, OuterGageMaster.User_Defined, 

        OuterGageMaster.Calibration_Frequency, OuterGageMaster.Calibration_Frequency_UOM, 

        dbo_tblPOGaugeDetail.bolGageLeavePriceBlank, dbo_tblPOGaugeDetail.intGageCost, 

        OuterGageMaster.Last_Calibration_Date, OuterGageMasterNext_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,

        (Select Count(strCustomerJobNum) 

             FROM tblGageActivity WHERE   

              OuterGageMaster.Last_Calibration_Date=tblGageActivity.datDateEntered) As   JobCount

FROM 

    (dbo_tblPOGaugeDetail INNER JOIN dbo_Gage_Master OuterGageMaster ON 

    dbo_tblPOGaugeDetail.strGageDetailID = OuterGageMaster.Gage_ID) INNER JOIN 

    qryRCEquipmentLastUse ON OuterGageMaster.Gage_ID = qryRCEquipmentLastUse.Gage_ID

ORDER BY

 dbo_tblPOGaugeDetail.strGageDetailID;

или это то, что вы пробовали?

0 голосов
/ 17 августа 2011

Сводная проблема:

Попытки добавить в мой отчет статистическую функцию для количества использований, поскольку калибровка элемента выполняется либо с нежелательными результатами, либо с ужасным «отсутствием агрегата»ошибка.

Решение:

Я решил оставить запрос, управляющий отчетом в одиночку, - вместо этого выбрал использование DLookup и DCount в зависимости от ситуации для получения последнего использованногодата из запроса, в котором указана дата последнего использования всех инструментов, и число использований, которые инструмент использовал со времени последней калибровки, с использованием вышеупомянутых совокупностей доменов соответственно.

Использование запроса, описанного в описании проблемыЯ могу получить последнюю использованную дату для всех инструментов.Я использовал оператор = DLookup в качестве источника для текстового поля в подотчете отчета, имеющего отношение к различным элементам как таковым:

=IIf((DLookUp("[qryRCCombinedUseEquipment]![datLastDateUsed]","[qryRCCombinedUseEquipment]","[qryRCCombinedUseEquipment]![strGageID]=[strGageDetailID]")) Is Null Or ([bolGageReturned]=True),"",DLookUp("[qryRCCombinedUseEquipment]![datLastDateUsed]","[qryRCCombinedUseEquipment]","[qryRCCombinedUseEquipment]![strGageID]=[strGageDetailID]"))

Это позволяет элементам, которые никогда не использовались, возвращать результат NULL, который будет отображатьсяв виде пустого текстового поля.

Однако число использований не будет отображать запрос с использованием = DCount (я пытался получить результаты, если это вообще произойдет, более десяти минут).Тем не менее, используя базовую таблицу действий, я использовал следующее утверждение:

=IIf([bolGageReturned],"","Used " & DCount("[dbo_tblGageActivity]![strGageID]","[dbo_tblGageActivity]","[dbo_tblGageActivity]![strGageID] = [strGageDetailID] And [dbo_tblGageActivity]![datDateEntered]  Between [txtLastCalibrationDate] And date()") & " times since last calibration")

Было бы извлечено количество раз, использованных с момента последней калибровки прибора, но не использовалось до или после сегодняшнего дня (некоторыеработы пост-датированы, как ни странно).Конечно, это МЕДЛЕННО (около тридцати секунд для большого документа с тридцатью или сорока инструментами).

У кого-нибудь еще есть лучшее решение для этого, или мне придется потерять производительность?Если ни у кого нет идей получше, я приму это как ответ через пять дней (21.08.2011).

...