如何在mysql case函数中执行子查询?

时间:2019-06-18 07:14:29

标签: mysql sql case

我正在尝试根据特定列的值(例如,在我的情况下为jjsc_rev_cycle)以不同的方式(作为两个不同的值)提取字段值的计数。

如果jjsc_rev_cycle0 然后得到

count(distinct jjsc_job_no) as new_order_count

其他

count(distinct jjsc_job_no) as rev_order_count

我正在尝试在1个这样的查询中执行此操作,但提示语法错误:

SELECT jjsc_rev_cycle, 
 CASE jjsc_rev_cycle 
 WHEN jjsc_rev_cycle = 0 
 THEN  select count(distinct jjsc_job_no) as new_order_count
 ELSE  select count(distinct jjsc_job_no) as rev_order_count 
 END
 FROM jdwf_job_status_cycle 
 WHERE  jjsc_time >= '2017-06-01' and jjsc_time <= '2017-06-03' group 
 by jjsc_wf_userid

样本表数据:

jjsc_job_no jjsc_rev_cycle  jjsc_time
 7201170    0               2019-06-12 15:49:26
 7201171    0               2019-06-12 15:35:56
 7201172    0               2019-06-12 15:31:49
 7201162    0               2019-06-12 15:31:15
 7201166    1               2019-06-12 15:30:39
 7201169    0               2019-06-12 15:29:22
 7201164    0               2019-06-12 15:28:38
 7201168    0               2019-06-12 15:27:55
 7201167    0               2019-06-12 15:26:49
 7201165    0               2019-06-12 15:25:51
 7201161    0               2019-06-12 15:24:28
 7201160    0               2019-06-12 15:22:21
 7201159    0               2019-06-12 15:21:13
 7201158    0               2019-06-12 15:20:16
 7200991    0               2019-06-11 16:18:15
 7200999    0               2019-06-11 14:38:48
 7200991    1               2019-06-11 14:37:56
 7200984    0               2019-06-11 14:37:06
 7201097    0               2019-05-30 12:55:43

预期输出:

new_order_count    rev_order_count
17                 2

我在做什么错?还是有其他方法可以代替它?

2 个答案:

答案 0 :(得分:1)

您无法在案件内部进行汇总,但在我看来您需要在下面进行

 SELECT jjsc_rev_cycle, sum(case when jjsc_rev_cycle = 0 then 1 else 0 end) 
 as new_order_count,
sum(case when jjsc_rev_cycle!= 0 then 1 else 0 end)  as rev_order_count

 FROM jdwf_job_status_cycle 
 WHERE  jjsc_time >= '2017-06-01' and jjsc_time <= '2017-06-03' group 
 by jjsc_wf_userid

获取示例数据后 我认为您需要在使用案例时先应用不同的内容

 SELECT jjsc_wf_userid, sum(case when jjsc_rev_cycle = 0 then 1 else 0 end) 
     as new_order_count,
    sum(case when jjsc_rev_cycle!= 0 then 1 else 0 end)  as rev_order_count
   from
   (  
   select distinct jjsc_wf_userid,jjsc_job_no,jjsc_rev_cycle   
     FROM jdwf_job_status_cycle 
   ) a group by jjsc_wf_userid

答案 1 :(得分:1)

您在问题中使用count(distinct),所以我认为这是必要的。如果是这样,则正确的逻辑是:

SELECT jjsc_wf_userid,
       COUNT(DISTINCT CASE WHEN jjsc_rev_cycle = 0 THEN  jjsc_job_no END) as new_order_count,
       COUNT(DISTINCT CASE WHEN jjsc_rev_cycle <> 0 THEN  jjsc_job_no END) as rev_order_count
FROM jdwf_job_status_cycle 
WHERE jjsc_time >= '2017-06-01' AND
      jjsc_time < '2017-06-04' 
GROUP BY jjsc_wf_userid

请注意,我更改了“时间”比较的第二个限制。大概jjsc_time有一个时间分量。无论如何,无论有没有时间分量,这种逻辑都是安全的。

如果您不需要COUNT(DISTINCT),则可以简化为:

SELECT jjsc_wf_userid,
       SUM(jjsc_rev_cycle = 0) as new_order_count,
       SUM(jjsc_rev_cycle <> 0) as rev_order_count
FROM jdwf_job_status_cycle 
WHERE jjsc_time >= '2017-06-01' AND
      jjsc_time < '2017-06-04' 
GROUP BY jjsc_wf_userid