【发布时间】:2021-05-14 08:50:02
【问题描述】:
如果标题不正确,我深表歉意,因为我不确定我需要询问什么,因为我不知道如何构建查询。
我构建了以下查询以返回化学品列表和其他相关字段。
SELECT DISTINCT
RDB.Chemical_Record.[Chemical_ID],
RDB.Chemical_Record.[Expires_Date],
RDB.Assay_Group.[Assay_Group_Name] AS [Assay Group],
RDB.Chemical.[Chemical_Name],
RDB.Chemical.[Product_Number],
RDB.Chemical_Record.[Lot_Number],
RDB.Storage_Location.[Location_Name]
FROM RDB.Chemical_Record
LEFT JOIN RDB.Chemical ON Chemical_Record.[Chemical_ID] = Chemical.[ID_Chemical]
LEFT JOIN RDB.Storage_Location ON Storage_Location.[ID_Storage_Location] = Chemical_Record.[Storage_Location_ID]
LEFT JOIN RDB.Chemical_To_AGroup ON Chemical_To_AGroup.[Chemical_ID] = Chemical_Record.[Chemical_ID]
LEFT JOIN RDB.Assay_Group ON Assay_Group.[ID_Assay_Group] = Chemical_To_AGroup.[Assay_Group_ID]
WHERE RDB.Chemical_Record.[Expires_Date] >= DATEADD(day,-60, GETDATE())
ORDER BY RDB.Chemical_Record.[Chemical_ID], RDB.Chemical_Record.[Expires_Date], RDB.Assay_Group.[Assay_Group_Name]
我在 VB.Net 应用程序中使用此查询,它将结果导出到 Excel 工作表,然后执行其他操作以删除我不需要的行。查询过程很快,但在 .Net 中使用 Excel 既痛苦又缓慢。
相反,我想构建查询以返回我想要的确切结果,我认为这是可能的,但我不知道如何。我尝试过使用Count、Group 和Having 的组合,但由于我从未与这些人合作过,所以我无法让他们为我工作。
示例:
SELECT
COUNT(RDB.Chemical_Record.[Chemical_ID]) Count_ID,
RDB.Chemical_Record.[Chemical_ID],
RDB.Chemical_Record.[Expires_Date]
FROM RDB.Chemical_Record
WHERE RDB.Chemical_Record.[Expires_Date] > DATEADD(day,30,GETDATE())
GROUP BY RDB.Chemical_Record.[Chemical_ID], RDB.Chemical_Record.[Expires_Date]
ORDER BY RDB.Chemical_Record.[Chemical_ID]
从这个例子可以看出,它不会返回 ID 的计数 where Expiration Date > DATEADD(day,30,GETDATE()) 也不会返回我真正想要的 ID。
我需要退回的是所有没有过期日期的化学品 (ID) > 今天 + 30 对应于该特定 ID。下面的屏幕截图显示了一个被提取的数据示例。黄色突出显示的行是该集中唯一应该返回的两个行,因为这两个 ID 没有其他化学物质的到期日期 > 今天 + 30。所有其他 ID 不应该显示,因为它们的 ID 为 @987654331 @(到期日期 > 今天 + 30) > 0.
如果有人可以帮助我使用适当的聚合函数构建查询,将不胜感激。
【问题讨论】:
标签: sql sql-server group-by count