如何使用嵌套案例查询获得不同的计数?
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获得“选择计数(*)”查询的结果?