【问题标题】:Access & SQL Server: Number of uses since date aggregate problem - new reporting problem (solved aggregate issue)Access 和 SQL Server:自日期聚合问题以来的使用次数 - 新报告问题(已解决的聚合问题)
【发布时间】:2011-10-25 10:26:34
【问题描述】:

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

问题:
尝试在我的报告中添加一个聚合函数,用于记录自项目校准以来的使用次数,结果要么是不希望的结果,要么是可怕的“聚合缺失”错误(不记得确切的警告)。

-- 编辑添加 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;

但我似乎无法使用以下字段从 tblGageActivity 聚合使用计数(创建计数(strCustomerJobNum)):

strGageID
strCustomerJobNum
datDateEntered
datTimeEntered

我尝试向之前列出的查询添加一个字段以执行 Count(strCustomerJobNum),其中 datDateEntered 与调用查询中的 Last_Calibration_Date 匹配 - 但我收到“缺少聚合”错误。如果我不考虑这个条件 - 它会运行 - 但只有当它的使用次数至少为一个时才会列出曾经发送的每台仪器(可悲的是,这根本不是我想要的)。

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

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

-- 编辑添加 08/15/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 查询不会由于从表中检索的字段数不匹配而失败。

最后,我创建了一个名为 qryCombinedUseEquipment 的 UNION 查询,将两者组合成一个列表:

qryCombinedUseEquipment

SELECT *
FROM qryRCEquipmentLastUse
UNION SELECT *
FROM qryRCEquipmentNeverUsed;

使用最后一个联合查询将 Last Used 日期提供给父查询在数据表视图中工作,但是当在报告中调用父查询时 - 我得到一个空白报告;因此,我们仍然会非常感谢您朝正确的方向轻推。


附录

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

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;

【问题讨论】:

  • 尝试在没有大量细节和文字的情况下制定您的问题/问题/问题

标签: sql sql-server ms-access aggregate-functions


【解决方案1】:

这行得通吗:

    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;

还是你尝试过的?

【讨论】:

  • 这似乎是可信的。但是,您的回答可能由于其不存在性而被忽略了。
  • 实际上,我会查看它 - 看看它与我当前的查询有何不同。扩展的表名对我很有帮助,因为我很难记住别名是什么时候出现的 - 但我确实计划在将这个程序用于一般用途时缩短它们以实现可维护性。
  • 您的查询没有正确的 INNER JOIN 语法,我尝试翻译它导致应用程序在尝试保存或运行此查询时崩溃。
【解决方案2】:

一块一块的……

首先——我怀疑你试图一次回答太多问题(正如你的 SELECT 中的 23 个字段所证明的那样),这将使聚合几乎不可能。首先缩小查询的范围——这个查询试图回答什么问题? (您总是可以提出更多查询来回答其他问题... :-)

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

提示——学习使用表别名。大型查询难以阅读;更糟糕的是因为重复的表名。

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

【讨论】:

  • 问题是查询中的所有信息都是生成的报告中使用的信息,并且是报告达到其目的所必需的 - 所以我不确定我是否真的可以减少超过已经是了。关于表别名的好提示,顺便说一句,我将看到在程序设计中实现这一点 - 这只小狗仍然是非常“Alpha”软件(目前只有我使用它)。 “上次使用”字段用于显示该项目上次在客户工作中使用的日期 - 这是我在此类报告中被问到的一个常见问题。
【解决方案3】:

问题总结:

尝试在我的报告中添加一个聚合函数,用于记录自项目校准以来的使用次数,结果要么是不希望的结果,要么是可怕的“聚合缺失”错误。

解决方案:

我决定让查询单独驱动报告,而是选择酌情使用 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")

它会检索自上次校准仪器以来使用的次数,但在此之前或今天之后没有使用(奇怪的是,有些工作是过时的)。当然,这很慢(包含三十或四十种乐器的大型文档大约需要 30 秒)。

还有其他人对此有更好的解决方案吗,还是我必须承担性能损失?如果没有人有更好的想法,我会在五天(2011 年 8 月 21 日)后接受这个作为答案。

【讨论】:

    猜你喜欢
    • 2015-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-04
    • 1970-01-01
    • 1970-01-01
    • 2019-04-15
    • 2023-03-21
    相关资源
    最近更新 更多