如何使用WHERE子句进行COUNT操作?

时间:2017-02-15 10:24:41

标签: 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
    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

所以,我想知道每个客户:

  • COUNT(DISTINCT t.idTrip) - &gt;此客户的出行次数
  • 当t.tripDone&lt;&gt;时的总和1 - &gt;此客户(不是进入)的旅行次数
  • t.codeIncident =&#39; CANCEL&#39; - &GT;此客户在取消时的行程次数。

我在这里犯的一个大错误是,一次旅行可以有多个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次?

非常感谢您的帮助!

如果您需要更多信息,我可以使用,并对我缺乏英语技能感到抱歉!

2 个答案:

答案 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”