我实际上有一个查询连接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
所以,我想知道每个客户:
我在这里犯的一个大错误是,一次旅行可以有多个codeIncidents(例如:一个idTrip的记录,其中包含codeIncident&#39; CANCEL&#39;另一个记录的idTrip与codeIncident相同&#39; DELAYED&#39;),所以当我在t.tripDone&lt;&gt;时计算总和1我得到的结果是:&#39; 2&#39;而不是&#39; 1&#39; (因为我的Clause中有2条记录,对于相同的idTrip,t.tripDone&lt;&gt; 1)。
你对我如何处理这个查询有任何想法,所以当tripDone&lt;&gt;时我可以做Sum。每次旅行1只1次?
非常感谢您的帮助!
如果您需要更多信息,我可以使用,并对我缺乏英语技能感到抱歉!
答案 0 :(得分:1)
听起来你想对你目前正在总结的列做同样的count(distinct ...)
模式,但是有一些逻辑。您可以以相同的方式在计数中使用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
有点多余,因为这是默认值。由于count()
忽略空值,如果when
不匹配,则不计算该旅行ID。
答案 1 :(得分:0)
首先在内部查询中选择idTrip字段,表示表“t”