Mysql 在同一个表上联接两个查询,并将列添加到结果中
我是MYSQL的新手,需要帮助才能完成查询 我有两个单独的查询,我只需要将它们放在一个查询中,就可以在PHP中使用 我正在使用以下SQL获取名为“导入”的表中的记录数,这些记录的作业完成日期小于或等于作业SLA到期日期 我的where子句检查“导入”表中过去6个月内完成的作业Mysql 在同一个表上联接两个查询,并将列添加到结果中,mysql,join,Mysql,Join,我是MYSQL的新手,需要帮助才能完成查询 我有两个单独的查询,我只需要将它们放在一个查询中,就可以在PHP中使用 我正在使用以下SQL获取名为“导入”的表中的记录数,这些记录的作业完成日期小于或等于作业SLA到期日期 我的where子句检查“导入”表中过去6个月内完成的作业 SELECT Year(job_completed_date), Month(job_completed_date), Count(*) AS Completed_On_Schedule
SELECT Year(job_completed_date),
Month(job_completed_date),
Count(*) AS Completed_On_Schedule
FROM import
WHERE job_completed_date >= Last_day(Now()) + interval 1 day - interval 6 month
AND job_completed_date <= job_sla_due_date
AND ( job_status = 'C'
OR job_status = 'C2'
OR job_status = 'C8' )
GROUP BY Year(job_completed_date),
Month(job_completed_date)
ORDER BY job_completed_date ASC
我的第二个查询与使用同一个表的查询类似,但我查找的是过去6个月内完成的作业总数,但我不担心作业的SLA到期日。我使用的SQL是
SELECT Year(job_completed_date),
Month(job_completed_date),
Count(*) AS Total_Completed
FROM import
WHERE job_completed_date >= Last_day(Now()) + interval 1 day - interval 6 month
AND ( job_status = 'C'
OR job_status = 'C2'
OR job_status = 'C8' )
GROUP BY Year(job_completed_date),
Month(job_completed_date)
ORDER BY job_completed_date ASC
结果输出与预期一致,并产生以下结果
Year Month Total_Completed
2017 3 1441
2017 4 1101
2017 5 1144
2017 6 1334
2017 7 1211
2017 8 311
我现在需要的是这样的输出
Year Month Completed_On_Schedule Total_Completed %_On_Schedule
2017 3 1155 1441 80.1
2017 4 838 1101 76.1
2017 5 881 1144 77
2017 6 1095 1334 82
2017 7 1073 1211 88.6
2017 8 295 311 94.8
因此,简而言之,我需要将我的两个查询合并在一起,并添加另一个名为%\u Completed\u On\u Schedule的列,它是按计划完成的作业的百分比,即Completed\u On\u Schedule列占总完成列的百分比
任何帮助都将不胜感激
问候
Alan只需在
选择上使用有条件的计数
传统提示在
中使用,而不是多个或
SELECT Year(job_completed_date),
Month(job_completed_date),
COUNT(CASE WHEN job_completed_date <= job_sla_due_date
THEN 1 END) as Completed_On_Schedule,
COUNT(*) AS Total_Completed,
COUNT(CASE WHEN job_completed_date <= job_sla_due_date
THEN 1 END) * 100.0 /
COUNT(*) AS Total_Completed as `%_On_Schedule`
FROM import
WHERE job_completed_date >= Last_day(Now()) + interval 1 day - interval 6 month
AND job_status IN ('C', 'C2', 'C8')
GROUP BY Year(job_completed_date),
Month(job_completed_date)
ORDER BY job_completed_date ASC
选择年份(作业完成日期),
月份(工作完成日期),
COUNT(CASE WHEN job_completed_date我在您的查询中添加了一列总数和一个CASE子句。此外,我删除了SLA的and,因为我们在CASE中有它_
SELECT Year(job_completed_date),
Month(job_completed_date),
SUM(CASE
WHEN job_completed_date <= job_sla_due_date THEN 1 ELSE 0
END) AS Completed_On_Schedule,
Count(*) AS Total_Completed
FROM import
WHERE job_completed_date >= Last_day(Now()) + interval 1 day - interval 6 month
AND ( job_status = 'C'
OR job_status = 'C2'
OR job_status = 'C8' )
GROUP BY Year(job_completed_date),
Month(job_completed_date)
ORDER BY job_completed_date ASC
选择年份(作业完成日期),
月份(工作完成日期),
总数(例)
作业完成时日期=最后一天(现在())+间隔1天-间隔6个月
和(作业状态='C'
或作业状态='C2'
或作业状态='C8')
按年份分组(工作完成日期),
月份(工作完成日期)
按作业\u完成\u日期ASC排序的订单
为了简单起见,我将您的查询称为QUERY\u ONE
和QUERY\u TWO
,您当然需要将这些引用替换为实际查询
SELECT a.Year, a.Month, a.Completed_On_Schedule, b.Total_Completed,
((a.Completed_On_Schedule / b.Total_Completed) * 100) AS `%_On_Schedule`
FROM (QUERY_ONE) AS a JOIN (QUERY_TWO) AS b ON a.Year = b.Year AND a.Month = b.Month;
此查询将在年和月匹配的行上连接两个表,然后从每个表中提取所需的值,并创建进度百分比列。您需要对您的进度百分比名称应用勾号,因为%是MySQL中的一个关键术语,因此我建议不要使用此符号,但这并不是什么大问题。使用嗯,不是计数,而是按计划完成计数也会起作用。@Acewin我添加了JOIN
版本,因为即使在这种情况下不需要,这也是OP要求的,在另一种情况下可能对他有用。我不喜欢使用SUM(1/0)
来计数。如果要计数,请使用count()
是的,我意识到了。这就是为什么我更新了我的评论。谢谢你的反馈,非常感谢。但是当你的SQL出现以下错误时,你的SQL语法有一个错误;检查与你的MySQL服务器版本相对应的手册,以获得正确的语法,以便在导入时使用near'as(按计划)
第8行的RE job_completed_date>=Last_day(Now())'有什么想法吗?可能是字段名中的%\u
?尝试删除它。您错过了%age只需确保乘以100.0
,否则会得到一个整数除法。啊,得到的是百分比而不是小数,感谢您捕捉到了它。
SELECT Year(job_completed_date),
Month(job_completed_date),
SUM(CASE
WHEN job_completed_date <= job_sla_due_date THEN 1 ELSE 0
END) AS Completed_On_Schedule,
Count(*) AS Total_Completed
FROM import
WHERE job_completed_date >= Last_day(Now()) + interval 1 day - interval 6 month
AND ( job_status = 'C'
OR job_status = 'C2'
OR job_status = 'C8' )
GROUP BY Year(job_completed_date),
Month(job_completed_date)
ORDER BY job_completed_date ASC
SELECT a.Year, a.Month, a.Completed_On_Schedule, b.Total_Completed,
((a.Completed_On_Schedule / b.Total_Completed) * 100) AS `%_On_Schedule`
FROM (QUERY_ONE) AS a JOIN (QUERY_TWO) AS b ON a.Year = b.Year AND a.Month = b.Month;