Sql 对分组记录的唯一值运行聚合函数
这应该是一项相当简单的任务。我可以用Sql 对分组记录的唯一值运行聚合函数,sql,tsql,Sql,Tsql,这应该是一项相当简单的任务。我可以用光标来完成它,但我真的想把它作为常规的查询来完成。表摘要如下:CustId,ProductId,OrderId,UnitPrice,LineTotal。我需要为每个CustId和ProductId获取所有LineTotal的SUM()和所有唯一OrderId的COUNT(),其中ProductId在至少两个不同的OrderId上是相同的。我的查询与下面的查询类似,但经过验证,我意识到OrderId的唯一性受到了影响,因此aggregate函数返回不正确的结果。
光标
来完成它,但我真的想把它作为常规的查询
来完成。表摘要如下:CustId
,ProductId
,OrderId
,UnitPrice
,LineTotal
。我需要为每个CustId
和ProductId
获取所有LineTotal
的SUM()
和所有唯一OrderId
的COUNT()
,其中ProductId
在至少两个不同的OrderId
上是相同的。我的查询与下面的查询类似,但经过验证,我意识到OrderId
的唯一性受到了影响,因此aggregate
函数返回不正确的结果。请告知SELECT h.CustId
, h.ProductId
, h.COUNT(DISTINCT h.OrderId)
, h.SUM(h.LineTotal)
FROM History h
GROUP BY h.CustId
, h.ProductId
HAVING COUNT(h.OrderId) > 1
其中ProductId在至少2个不同的OrderId上相同
您需要在(子查询)中使用(或EXISTS()
也可以)构造来强制执行此要求,而不是使用。这是因为您按ProductId
和CustId
进行分组,但此要求仅在ProductId
上,不应受到CustId
的影响
在伪代码中
WHERE ProductId IN (SELECT ProductIds that have at least 2 different OrderIds)
其中ProductId在至少2个不同的OrderId上相同
您需要在(子查询)
中使用(或EXISTS()
也可以)构造来强制执行此要求,而不是使用。这是因为您按ProductId
和CustId
进行分组,但此要求仅在ProductId
上,不应受到CustId
的影响
在伪代码中
WHERE ProductId IN (SELECT ProductIds that have at least 2 different OrderIds)
您希望拥有COUNT(不同的h.OrderId)>2
而不是拥有COUNT(h.OrderId)>1
,这不是2个不同的OrderId的意思吗?如果不使用>1
但保持不同
:
SELECT h.CustId
, h.ProductId
, h.COUNT(DISTINCT h.OrderId)
, h.SUM(h.LineTotal)
FROM History h
GROUP BY h.CustId
, h.ProductId
HAVING COUNT(DISTINCT h.OrderId) > 2
您希望拥有COUNT(不同的h.OrderId)>2
而不是拥有COUNT(h.OrderId)>1
,这不是2个不同的OrderId的意思吗?如果不使用>1
但保持不同
:
SELECT h.CustId
, h.ProductId
, h.COUNT(DISTINCT h.OrderId)
, h.SUM(h.LineTotal)
FROM History h
GROUP BY h.CustId
, h.ProductId
HAVING COUNT(DISTINCT h.OrderId) > 2
共享示例数据和预期输出如果您添加一些示例输入数据,以及您预期的结果,那么理解您的意思就会容易得多。。。您的查询甚至不是有效的SQL。如果没有样本数据和期望的结果,就不可能知道您真正想要的是什么。很抱歉,我使用HAVING COUNT()h.OrderId)
运行了查询,但忘了在问题中键入它。共享样本数据和期望的输出如果您添加了一些示例输入数据,以及您期望的结果,理解你的意思会容易得多。。。您的查询甚至不是有效的SQL。如果没有样本数据和期望的结果,就不可能知道您真正在问什么。很抱歉,我使用HAVING COUNT()h.OrderId)
运行了查询,但忘了在问题中键入它。我不相信这种理解。OP太模糊,注意到,我意识到OrderId的唯一性被破坏了,因此聚合函数返回不正确的结果
与此解释不一致。@MatBailie这是可能的;我最初读了两种可能的解释。我认为这是更可能的问题。在我看来,OP更可能是错误地解释了意外结果的原因,他不太可能知道在SELECT列表中使用COUNT DISTINCT
,但在HAVING子句中不使用。我不相信这种理解。OP太模糊,注意到,我意识到OrderId的唯一性被破坏了,因此聚合函数返回不正确的结果
与此解释不一致。@MatBailie这是可能的;我最初读了两种可能的解释。我认为这是更可能的问题。在我看来,OP更可能错误地解释了意外结果的原因,并且不太可能知道在SELECT列表中使用COUNT DISTINCT
,但在HAVING子句中不使用。