1

我有一个问题有点像:

MySQL:子查询中的总和值

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

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

我创建了一个几乎适用于这个示例数据库的查询:

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

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

4

2 回答 2

3

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

SELECT COUNT(ProductID), 
       COUNT(DISTINCT CASE WHEN ProductID = 51 THEN OrderDetailID END) 
FROM OrderDetails
于 2013-07-10T19:47:51.567 回答
0

我会尝试这样的事情

select count(productid)
, case when productid = 51 then count(distinct orderdetailid)
else some other number end
from orderdetails
于 2013-07-10T19:33:50.987 回答