我正在尝试根据特定列的值(例如,在我的情况下为jjsc_rev_cycle
)以不同的方式(作为两个不同的值)提取字段值的计数。
如果jjsc_rev_cycle
是0
然后得到
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
我在做什么错?还是有其他方法可以代替它?
答案 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