Mysql 在同一个表上联接两个查询,并将列添加到结果中

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

我是MYSQL的新手,需要帮助才能完成查询

我有两个单独的查询,我只需要将它们放在一个查询中,就可以在PHP中使用

我正在使用以下SQL获取名为“导入”的表中的记录数,这些记录的作业完成日期小于或等于作业SLA到期日期

我的where子句检查“导入”表中过去6个月内完成的作业

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;