Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.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
Sql 对分组记录的唯一值运行聚合函数_Sql_Tsql - Fatal编程技术网

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子句中不使用。