【发布时间】: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