Sql 如何使用WHERE子句进行计数?

Sql 如何使用WHERE子句进行计数?,sql,oracle,join,Sql,Oracle,Join,实际上,我有一个连接3个表的查询来收集信息,因此我可以计算一些KPI,但我的逻辑有缺陷,下面是我的实际查询: SELECT t.idCustomer, t.nameCustomer COUNT(DISTINCT t.idTrip), SUM( CASE WHEN t.tripDone <> 1 THEN 1 ELSE 0 END), SUM(CASE WHEN t.codeIncident = 'CANCEL' THEN 1

实际上,我有一个连接3个表的查询来收集信息,因此我可以计算一些KPI,但我的逻辑有缺陷,下面是我的实际查询:

SELECT t.idCustomer, t.nameCustomer
COUNT(DISTINCT t.idTrip), 
SUM(
  CASE
    WHEN t.tripDone <> 1
    THEN 1
    ELSE 0
  END),
SUM(CASE 
    WHEN t.codeIncident = 'CANCEL'
    THEN 1
    ELSE 0
   END)
FROM 
(SELECT customer.idCustomer, customer.nameCustomer, trip.tripDone, incident.codeIncident
FROM CUSTOMER customer
JOIN TRIP trip ON customer.idCustomer = trip.idCustomer
JOIN INCIDENT incident ON trip.idTrip = incident.idTrip) t
GROUP BY t.idCustomer, t.nameCustomer
因此,我想了解每个客户的:

COUNTDISTINCT t.idTrip->此客户的行程数 t.tripDone时的总和1->此客户未输入的行程数 当t.codeIncident='CANCEL'->该客户取消的行程数时的总和。 我在这里犯的一个大错误是,一次旅行可以有多个codeIncident,例如:一条idTrip记录的codeIncident为“CANCEL”,另一条idTrip记录的codeIncident为“DELAYED”,因此,当我计算t.tripDone 1时的和时,我得到的结果是:“2”而不是“1”,因为在我的from子句中有两条记录具有相同idTrip的t.tripDone 1

您是否知道我应该如何处理此查询,以便在tripId对每个tripId只执行1次时,我可以进行求和

非常感谢你的帮助


如果你需要更多的信息,我可以提供,很抱歉我缺乏英语技能

听起来你想做同样的事情。。。当前正在求和的列的模式,但带有一些逻辑。您可以用相同的方式在计数中使用case:

...
COUNT(
  DISTINCT CASE
    WHEN t.tripDone <> 1
    THEN t.idTrip
    ELSE null
  END),
COUNT(
  DISTINCT CASE 
    WHEN t.codeIncident = 'CANCEL'
    THEN t.idTrip
    ELSE null
   END)

else null有点多余,因为这是默认值。As count忽略空值,如果时间不匹配,则该行程ID不被计数。

首先在内部查询中选择idTrip字段,这意味着表t

Oracle,抱歉没有精确性,我想您只需要行程的最后状态。尝试使用诸如row_number之类的窗口功能筛选出最后一个状态。当所有CodeIncident都被取消或延迟时,tripDone的值是多少?@KaranShah,例如,当所有codeIncidents都被取消或延迟时,tripDone的值是0,但也可能是这样1@lilli那是什么时候?非常感谢你的解释,我很佩服你!哦,是的,它是在真实的情况下完成的,但当我为StackOverflow重新编写它时,我忘记了它,我的错@为什么要使用子查询内联视图?