Sql 如何使用WHERE子句进行计数?
实际上,我有一个连接3个表的查询来收集信息,因此我可以计算一些KPI,但我的逻辑有缺陷,下面是我的实际查询: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
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字段,这意味着表tOracle,抱歉没有精确性,我想您只需要行程的最后状态。尝试使用诸如row_number之类的窗口功能筛选出最后一个状态。当所有CodeIncident都被取消或延迟时,tripDone的值是多少?@KaranShah,例如,当所有codeIncidents都被取消或延迟时,tripDone的值是0,但也可能是这样1@lilli那是什么时候?非常感谢你的解释,我很佩服你!哦,是的,它是在真实的情况下完成的,但当我为StackOverflow重新编写它时,我忘记了它,我的错@为什么要使用子查询内联视图?