出入境及;SQL Server:自日期起的使用次数聚合问题-新报告问题(已解决聚合问题)

出入境及;SQL Server:自日期起的使用次数聚合问题-新报告问题(已解决聚合问题),sql,sql-server,ms-access,aggregate-functions,Sql,Sql Server,Ms Access,Aggregate Functions,背景: 我一直在努力简化程序中运行报告所涉及的工作。最近,我不得不提供一份工作编号清单,一份用于成本/效益分析项目清单的工具。主要是查看仪器自上次维修/校准以来的使用频率,以及上次有人使用仪器的频率。我希望将其集成到有助于生成报告的查询中——但我一直在使用数量方面遇到困难——因为我希望聚合基于仪器上次校准的日期(基于同一查询中的字段)。我可以让它给我在系统中的总使用次数-但它不会接受限制,我希望它只是计算自上次校准以来使用的次数 问题: 尝试在我的报告中添加聚合函数,以获得使用次数,因为项目的校

背景:
我一直在努力简化程序中运行报告所涉及的工作。最近,我不得不提供一份工作编号清单,一份用于成本/效益分析项目清单的工具。主要是查看仪器自上次维修/校准以来的使用频率,以及上次有人使用仪器的频率。我希望将其集成到有助于生成报告的查询中——但我一直在使用数量方面遇到困难——因为我希望聚合基于仪器上次校准的日期(基于同一查询中的字段)。我可以让它给我在系统中的总使用次数-但它不会接受限制,我希望它只是计算自上次校准以来使用的次数

问题:
尝试在我的报告中添加聚合函数,以获得使用次数,因为项目的校准遇到了不希望出现的结果或可怕的“聚合缺失”错误(不记得确切的警告)

--编辑后添加至2011年12月8日@16:09--

对于此查询排除的从未使用过的工具,发现了使用Max AGGRATE的另一个问题

详细信息:

以下是迄今为止有效的查询:

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;
但我似乎无法使用以下字段从tblGageActivity聚合使用计数(进行计数(strcstomerjobNum)):

strGageID
strCustomerJobNum
datDateEntered
datTimeEntered
我试图向以前列出的查询中添加一个字段以进行计数(strcstomerjobnum),其中datDateEntered与调用查询中的最后一个校准日期匹配,但我得到了“缺少聚合”错误。如果我不考虑这个条件,它将运行,但只在使用计数至少为一的情况下才会列出所有发出的仪器(遗憾的是,这根本不是我想要的)

我还想确保,如果我应该得到一个零使用计数-我将得到一个零,而不是我的预期记录减去空结果

我希望有人能告诉我这个问题出在哪里——我想节省目前在另一个程序中运行活动报告的时间,无论何时我想要生成此报告。提前谢谢,如果您需要我发布更多信息,请告诉我

--编辑后添加至2011年8月15日@14:41--

我通过创建一个“纯”的第一步查询来解决Max()聚合问题,以获得所有使用qryrcequipments的最新日期的仪器的列表

qryRCEquipmentLastUse

SELECT dbo.tblGageActivity.strGageID, Max(dbo.tblGageActivity.datDateEntered) AS datLastDateUsed
FROM dbo.tblGageActivity
GROUP BY dbo.tblGageActivity.strGageID;
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));
SELECT *
FROM qryRCEquipmentLastUse
UNION SELECT *
FROM qryRCEquipmentNeverUsed;
然后,我创建了一个“纯”列表,列出了所有根本没有用处的工具,作为一个名为qryRCEquipmentNeverUsed的查询

QRYRCE设备未使用

SELECT dbo.tblGageActivity.strGageID, Max(dbo.tblGageActivity.datDateEntered) AS datLastDateUsed
FROM dbo.tblGageActivity
GROUP BY dbo.tblGageActivity.strGageID;
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));
SELECT *
FROM qryRCEquipmentLastUse
UNION SELECT *
FROM qryRCEquipmentNeverUsed;
注意:插入NULL是为了使第三个联合查询不会因为从表中检索的字段数量不匹配而失败

最后,我创建了一个名为qryCombinedUseEquipment的联合查询,将两者合并到一个列表中:

qryComponendSeeEquipment

SELECT dbo.tblGageActivity.strGageID, Max(dbo.tblGageActivity.datDateEntered) AS datLastDateUsed
FROM dbo.tblGageActivity
GROUP BY dbo.tblGageActivity.strGageID;
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));
SELECT *
FROM qryRCEquipmentLastUse
UNION SELECT *
FROM qryRCEquipmentNeverUsed;
使用最后一个联合查询将最后使用的日期提供给父查询在数据表视图中工作,但是当在报告中调用父查询时,我得到一个空白报告;因此,在正确的方向上轻推仍然是非常值得赞赏的


附录

与上面相同的脚本,但具有较短的表别名(以防有人发现更清晰):

这是否有效:

    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;
还是你试过了?

一件一件地

首先——我怀疑您试图一次回答太多问题(SELECT中的23个字段证明了这一点),这将使聚合几乎不可能。首先缩小查询的范围——这个查询试图回答什么问题?(您始终可以进行更多查询以回答其他问题…:-)

1) 自上次校准以来使用了多少次?
2) 自上次…使用以来有多少次使用?(不知道你说的是什么意思——可能是最后一次注销,或者是最后一次租赁,等等)

提示:学习使用表格别名。大型查询很难阅读;更糟糕的是,表名重复

1) 例如:dbo_tbl_pogagedetail.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

摘要问题:

尝试在我的报告中添加聚合函数,以计算项目校准后的使用次数,结果可能不理想,也可能出现可怕的“聚合缺失”错误

解决方案:

我决定不使用驱动报告的查询—而是选择使用DLookup和DCount(视情况而定)从查询中检索上次使用的日期,该查询提供所有仪器的上次使用日期,以及仪器自上次校准以来的使用次数,分别使用上述域聚合

使用问题描述中描述的查询,我能够检索所有仪器的上次使用日期。我使用了一个=DLookup语句作为报表子报表中文本框的源,该文本框处理各种项目,例如:

=IIf((DLookUp("[qryRCCombinedUseEquipment]![datLastDateUsed]","[qryRCCombinedUseEquipment]","[qryRCCombinedUseEquipment]![strGageID]=[strGageDetailID]")) Is Null Or ([bolGageReturned]=True),"",DLookUp("[qryRCCombinedUseEquipment]![datLastDateUsed]","[qryRCCombinedUseEquipment]","[qryRCCombinedUseEquipment]![strGageID]=[strGageDetailID]"))
这允许从未使用过的项返回空结果,该结果将显示为空白文本框

然而,使用的次数并不能从使用=DCount的查询中获得(我试过了,检索结果可能需要10分钟以上)。但是,使用基础活动表,我使用了以下语句:

=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")
它将检索自上次校准仪器以来使用过的次数,但在此之前或之后没有使用过(奇怪的是,有些工作是过时的)。当然,这很慢(对于一个包含30或40个仪器的大型文档,大约30秒)

还有其他人有更好的解决方案吗