Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于查找ID组的(日期计数>X)=0的SQL查询_Sql_Sql Server_Group By_Count - Fatal编程技术网

用于查找ID组的(日期计数>X)=0的SQL查询

用于查找ID组的(日期计数>X)=0的SQL查询,sql,sql-server,group-by,count,Sql,Sql Server,Group By,Count,如果标题不正确,我很抱歉,因为我不确定我需要问什么,因为我不知道如何构建查询 我创建了以下查询以返回化学品和其他相关字段的列表 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

如果标题不正确,我很抱歉,因为我不确定我需要问什么,因为我不知道如何构建查询

我创建了以下查询以返回化学品和其他相关字段的列表

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既痛苦又缓慢

相反,我希望构建查询以返回我想要的确切结果,我认为这是可能的,但我不知道如何实现。我曾尝试使用计数、分组和拥有的组合,但由于我从未与这些组合一起工作过,因此无法让它们为我工作。 例如:

从这个例子中可以看到,它既不返回ID的计数,其中Expiration Date>DATEADDday,30,GETDATE,也不返回我实际想要的ID

我需要返回的是所有没有过期日期>今天+30的特定ID的化学品ID。下面的屏幕截图显示了提取数据的示例。黄色突出显示的行是该集中应返回的唯一两行,因为这两个ID中没有过期日期>今天+30的其他化学品。所有其他ID都不应显示,因为它们的ID为COUNTExpiration Date>Today+30>0

如果有人能帮助我使用适当的聚合函数构建查询,我将不胜感激

我需要返回的是所有没有过期日期>今天+30的特定ID的化学品ID

对于这个问题,可以使用HAVING子句。没有需要的地方:

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]
使用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
以及显示搜索结果的屏幕截图:


非常感谢。这解决了我的问题。为了得到我所需要的东西,我不得不四处乱逛,但拥有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