Mysql-使用大小写和计数创建视图
我试图从这两个表中创建一个包含CASE和COUNT的视图Mysql-使用大小写和计数创建视图,mysql,Mysql,我试图从这两个表中创建一个包含CASE和COUNT的视图 t_jobs | job_id | +--------+ | 1 | | 2 | | 3 | | 4 | t_emails | email_id | job_id | email_log | +----------+--------+-----------+ | 1 | 1 | OK | | 2 | 1 | ERROR |
t_jobs
| job_id |
+--------+
| 1 |
| 2 |
| 3 |
| 4 |
t_emails
| email_id | job_id | email_log |
+----------+--------+-----------+
| 1 | 1 | OK |
| 2 | 1 | ERROR |
| 3 | 2 | ERROR |
| 4 | 3 | OK |
结果应该是这样
view_jobs
| job_id | email_check | email_total |
+--------+-------------+-------------+
| 1 | 1 | 2 |
| 2 | 1 | 1 |
| 3 | 0 | 1 |
| 4 | 0 | 0 |
我试着用这种方法,但没有成功
SELECT
j.job_id,
CASE WHEN MAX( e.email_log != 'OK' ) THEN 1 ELSE 0 END email_check
COUNT( e.email_log ) AS email_total
FROM t_jobs j
LEFT OUTER JOIN `t_emails` `e` ON `j`.`job_id` = `e`.`job_id`
GROUP BY
j.job_id;
你能告诉我怎么做吗谢谢您刚刚忘记了第二列末尾的逗号(,)。
我也稍微改变了你的状况。
此处,电子邮件检查1表示作业id有错误
0表示没有错误
SELECT
j.job_id,
CASE WHEN MIN( e.email_log ) = 'error' THEN 1 ELSE 0 END as email_check,
COUNT( e.email_log ) AS email_total
FROM t_jobs j
LEFT OUTER JOIN `t_emails` `e` ON `j`.`job_id` = `e`.`job_id`
GROUP BY
j.job_id;
我想您需要一个简单的条件聚合-
SELECT j.job_id,
COUNT(CASE WHEN e.email_log <> 'OK' THEN 1 ELSE NULL END) email_check,
COUNT(e.email_log) AS email_total
FROM t_jobs j
LEFT OUTER JOIN `t_emails` `e` ON `j`.`job_id` = `e`.`job_id`
GROUP BY j.job_id;
选择j.job\u id,
计数(e.email\u log“OK”后为1,否则为空结束)电子邮件检查,
将(如电子邮件日志)计入电子邮件总数
来自t_jobs j
左外接't\u'e'在'j'上。'job\u id`='e`。'job\u id``
按j.job_id分组;
你能解释一下email\u check列的逻辑吗?为什么job\u id
4有email\u check
=1?我想应该是0
@GMB-对不起,我弄错了。我编辑了它。你能解释一下email\u check栏中的1和0吗?你的代码会返回你期望的结果。你的问题是什么?@MadhurBhaiya,你是想像我一样删除ELSE
子句吗?这没有任何区别。这都是为了遵循更清晰的语法来理解;这样任何人都可以阅读它,并找出发生了什么ELSE NULL
明确表示,如果没有匹配项,则不计算在内。我更喜欢以稍微冗长为代价的更清晰的查询,因为这样通常可以避免犯类似ELSE 0
;)的错误@MadhurBhaiya,完全同意这一点,并肯定会尝试在未来遵循同样的原则。像这样的小事清楚地表明了印第安人和非印第安人的区别。