【问题标题】:SQL Query to Find if (Count of date > X) = 0 For Group of IDSQL查询以查找ID组是否(日期计数> X)= 0
【发布时间】: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 既痛苦又缓慢。

相反,我想构建查询以返回我想要的确切结果,我认为这是可能的,但我不知道如何。我尝试过使用CountGroupHaving 的组合,但由于我从未与这些人合作过,所以我无法让他们为我工作。 示例:

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


    【解决方案1】:

    我需要退回的所有化学品 (ID) 没有过期日期 > 今天 + 30 对应该特定 ID。

    对于这个问题,您可以使用HAVING 子句。不需要WHERE

    SELECT COUNT(*) as Count_ID, cr.[Chemical_ID]
    FROM RDB.Chemical_Record cr
    GROUP BY cr.[Chemical_ID]
    HAVING MAX(cr.Expires_Date) <= DATEADD(day, 30, GETDATE())
    ORDER BY cr.[Chemical_ID]
    

    【讨论】:

    • 谢谢!这解决了我的问题。为了得到我需要的东西,我不得不搞砸一些,但HAVING MAX 是解决方案。
    【解决方案2】:

    使用HAVING MAX 解决了我的问题,然后我能够准确地找出我需要的东西。我不得不做更多的研究来弄清楚如何恢复我所有的专栏,但这并没有那么困难。

    这是我的最终解决方案:

    WITH CHEM AS (
        SELECT RDB.Chemical_Record.[Chemical_ID]
        FROM RDB.Chemical_Record
        GROUP BY RDB.Chemical_Record.[Chemical_ID]
        HAVING MAX(RDB.Chemical_Record.Expires_Date) <= DATEADD(day, 60, GETDATE())
        )
    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
        INNER JOIN CHEM ON CHEM.Chemical_ID = RDB.Chemical_Record.Chemical_ID
        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 Expires_Date >= DATEADD(day, -60, GETDATE())
    ORDER BY RDB.Chemical_Record.[Chemical_ID], RDB.Chemical_Record.Expires_Date
    

    以及显示搜索结果的屏幕截图:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-06
      相关资源
      最近更新 更多