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

Posted

技术标签:

【中文标题】如何使用嵌套案例查询获得不同的计数?【英文标题】:How To Get A Distinct Count Using a Nested Case Query? 【发布时间】:2013-07-10 19:16:54 【问题描述】:

我有一个类似的问题:

mysql: Sum values in subqueries

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

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

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

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

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

【问题讨论】:

解决潜在的技术问题可能是一个更好的解决方案。 我同意,只是这个假设的描述与示例数据库列名称最匹配。我正在做的事情没有实际的技术问题,我只是有一种情况,需要在其他复杂聚合的返回中明确计数。 【参考方案1】:

您的查询非常接近。您只需将distinct 移到case 之前:

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

【讨论】:

【参考方案2】:

我会尝试这样的事情

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

【讨论】:

你不能在聚合函数之外使用productid,除非你GROUP BY productid

以上是关于如何使用嵌套案例查询获得不同的计数?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用Apache Jena获得“选择计数(*)”查询的结果?

如何使用嵌套的 SELECT 子查询优化 UPDATE?

mysql嵌套计数-如何?

如何获得最近 x 周数据的不同计数,但在红移中按周分组?

Visualforce页面根据案例类别显示案例计数,单击每个类别我想获得案例的详细视图。怎么样?

计数,拥有和案例陈述