Sql server T-SQL在具有聚合/组的查询中选择前1名

Sql server T-SQL在具有聚合/组的查询中选择前1名,sql-server,tsql,Sql Server,Tsql,我对SQL还是相当陌生的。这是我试图运行的查询的精简版本。假设此查询查找具有3个以上案例的客户,并显示前1个案例或所有案例,但除了所有案例编号外,还显示每行中每个客户的案例总数 TOP 1子查询方法不起作用,但是否有其他方法可以获得我需要的结果?希望这是有道理的 代码如下: SELECT t1.StoreID, t1.CustomerID, t2.LastName, t2.FirstName ,COUNT(t1.CaseNo) AS CasesCount ,(SELECT TOP 1 t1.Ca

我对SQL还是相当陌生的。这是我试图运行的查询的精简版本。假设此查询查找具有3个以上案例的客户,并显示前1个案例或所有案例,但除了所有案例编号外,还显示每行中每个客户的案例总数

TOP 1子查询方法不起作用,但是否有其他方法可以获得我需要的结果?希望这是有道理的

代码如下:

SELECT t1.StoreID, t1.CustomerID, t2.LastName, t2.FirstName
,COUNT(t1.CaseNo) AS CasesCount
,(SELECT TOP 1 t1.CaseNo)
FROM MainDatabase t1
INNER JOIN CustomerDatabase t2
ON t1.StoreID = t2.StoreID
WHERE t1.SubmittedDate >= '01/01/2017' AND t1.SubmittedDate <= '05/31/2017'
GROUP BY t1.StoreID, t1.CustomerID, t2.LastName, t2.FirstName
HAVING COUNT (t1.CaseNo) >= 3
ORDER BY t1.StoreID, t1.PatronID
我希望它看起来像这样,要么一行显示最近的案例和细节,要么几行显示每个案例的所有细节,以及店铺id、客户id、姓氏、名字和案例数


对于这些,我通常喜欢制作一个临时骨料表:

DROP TABLE IF EXISTS #tmp; 
CREATE TABLE #tmp ( 
CustomerlD int NOT NULL DEFAULT 0,
case_count int NOT NULL DEFAULT 0,
case_max int NOT NULL DEFAULT 0, 
); 
INSERT INTO #tmp 
(CustomerlD, case_count, case_max) 
SELECT CustomerlD, COUNT(tl.CaseNo), MAX(tl.CaseNo) 
FROM MainDatabase 
GROUP BY CustomerlD; 

然后,您可以将此tmp表连接回要显示其上案例数量或最大案例数量的任何其他表。您可以将其限制为有3个以上案例的客户,其中案例计数>3

对于这些案例,我通常喜欢制作一个临时汇总表:

DROP TABLE IF EXISTS #tmp; 
CREATE TABLE #tmp ( 
CustomerlD int NOT NULL DEFAULT 0,
case_count int NOT NULL DEFAULT 0,
case_max int NOT NULL DEFAULT 0, 
); 
INSERT INTO #tmp 
(CustomerlD, case_count, case_max) 
SELECT CustomerlD, COUNT(tl.CaseNo), MAX(tl.CaseNo) 
FROM MainDatabase 
GROUP BY CustomerlD; 

然后,您可以将此tmp表连接回要显示其上案例数量或最大案例数量的任何其他表。您可以将其限制为有3个以上案例的客户,其中案例计数>3

TOP 1和MAX是否会以相同的方式工作,并提供此案例的最新结果?如果是,那有什么区别?谢谢你的回答!请不要以图片形式发布代码。我已从您发布的图片中添加了代码。请看这篇关于如何在您的答案中发布代码的文章对不起,ClearLogic,以前从未需要遵循所有这些步骤,只是SQL代码有一些问题。谢谢你把它清理干净@Jenn TOP 1将获取结果集中的第一个结果,而不考虑该结果集中的值。MAX是从给定列返回最大值的聚合函数。假设CaseNo随着案例的增加而增加,那么MAXCaseNo将为每个客户获得最大的CaseNo,因为您已经按CustomerID进行了分组。这有意义吗?是的,有意义,谢谢你的澄清!然而,我也希望它能返回CaseDetail,所以我希望使用Top1来获取最新的CaseNo和CaseDetail。我不能使用MAXCaseDetail,因为它是编码的。例如,初始报告:1,后续:2,所以它只返回最大的数字,而不是最新案例的案例详细信息否。关于如何处理这个问题有什么想法吗?谢谢TOP 1和MAX是否会以同样的方式为我提供这种情况下的最新结果?如果是,那有什么区别?谢谢你的回答!请不要以图片形式发布代码。我已从您发布的图片中添加了代码。请看这篇关于如何在您的答案中发布代码的文章对不起,ClearLogic,以前从未需要遵循所有这些步骤,只是SQL代码有一些问题。谢谢你把它清理干净@Jenn TOP 1将获取结果集中的第一个结果,而不考虑该结果集中的值。MAX是从给定列返回最大值的聚合函数。假设CaseNo随着案例的增加而增加,那么MAXCaseNo将为每个客户获得最大的CaseNo,因为您已经按CustomerID进行了分组。这有意义吗?是的,有意义,谢谢你的澄清!然而,我也希望它能返回CaseDetail,所以我希望使用Top1来获取最新的CaseNo和CaseDetail。我不能使用MAXCaseDetail,因为它是编码的。例如,初始报告:1,后续:2,所以它只返回最大的数字,而不是最新案例的案例详细信息否。关于如何处理这个问题有什么想法吗?谢谢你有没有一个结果应该是什么样的例子?我已经更新了我的原始问题,以包括我希望它返回的列。什么决定了选择哪一个案例?你能提供示例输入和输出吗?你有一个示例说明结果应该是什么样的吗?我已经更新了我的原始问题,以包括我希望它返回的列。什么决定了选择哪种情况?你能提供样本输入和输出吗?