如何使用嵌套案例查询获得不同的计数?

时间:2013-07-10 19:16:54

标签: sql count distinct case

我有一个问题:

MySQL: Sum values in subqueries

我有一个较大的where部分进行一些过滤,然后在我做不同的类别时想在select部分进行过滤。

我的情况不同之处在于我需要使用不同的使用情况计数而不是总和:您有多个订单并希望计算特定产品的订单数量(除了返回一堆其他聚合在其他条件)。但是,由于技术问题,订单系统有时会创建两个几乎相同的行,这些行具有相同的ProductID和相同的OrderID(其他列将略有不同,例如订单时间)。但是,您只想计算特定产品的不同订单的数量(例如,每个唯一订单ID仅+1)。但是对于某些其他聚合,您需要使用重复条目,因此您必须在select部分中使用case子查询进行计数。

我创建了一个几乎适用于此sample database的查询:

SELECT COUNT(ProductID)
, COUNT(CASE WHEN ProductID = 51 THEN DISTINCT OrderDetailID END) 
FROM OrderDetails

然而,它抱怨语法错误。一旦我删除'DISTINCT'它就可以正常工作,但是这会导致重复计算(虽然样本数据库中不存在,但我的存在)这就是我需要'DISTINCT'工作的原因

2 个答案:

答案 0 :(得分:2)

您的查询非常接近。您只需要在distinct之前移动case

SELECT COUNT(ProductID), 
       COUNT(DISTINCT CASE WHEN ProductID = 51 THEN OrderDetailID END) 
FROM OrderDetails

答案 1 :(得分:0)

我会尝试这样的事情

select count(productid)
, case when productid = 51 then count(distinct orderdetailid)
else some other number end
from orderdetails