将两行合并到新列mysql中

将两行合并到新列mysql中,mysql,sql,Mysql,Sql,我正在运行一个SQL查询,该查询提供如下所示的结果集。我正在合并来自jobentry(适用于在正常工作时间工作的员工)和overtimejobentry(适用于加班的员工)的结果 我想做的是合并具有相同jobNumber和wbsCode的行,以便每个作业和代码的正常工作时间和加班时间显示在同一行中 是否有一种方法可以将两行合并为一行,并为附加数据创建一个新列 SQL查询: SELECT fk_jobNumber AS jobNumber, wbsCode, SUM(tu

我正在运行一个SQL查询,该查询提供如下所示的结果集。我正在合并来自
jobentry
(适用于在正常工作时间工作的员工)和
overtimejobentry
(适用于加班的员工)的结果

我想做的是合并具有相同
jobNumber
wbsCode
的行,以便每个作业和代码的正常工作时间和加班时间显示在同一行中

是否有一种方法可以将两行合并为一行,并为附加数据创建一个新列

SQL查询:

SELECT 
    fk_jobNumber AS jobNumber,
    wbsCode,
    SUM(tue + wed + thu + fri + mon) AS totalHours
FROM
    jobentry
        INNER JOIN
    task ON task.taskID = jobentry.fk_taskID
        INNER JOIN
    wbscodeitem ON wbscodeitem.wbsCodeItemID = task.fk_wbsCodeItemID
        INNER JOIN
    job ON job.jobNumber = wbscodeitem.fk_jobNumber
GROUP BY fk_jobNumber , wbsCode 

UNION

/*Same SQL statement as above except it's for table overtimejobentry instead of jobentry*/
SELECT 
    fk_jobNumber AS jobNumber,
    wbsCode,
    SUM(tue + wed + thu + fri + sat + sun + mon) AS totalHours
FROM
    overtimejobentry
        INNER JOIN
    task ON task.taskID = overtimejobentry.fk_taskID
        INNER JOIN
    wbscodeitem ON wbscodeitem.wbsCodeItemID = task.fk_wbsCodeItemID
        INNER JOIN
    job ON job.jobNumber = wbscodeitem.fk_jobNumber
GROUP BY fk_jobNumber , wbsCode
jobNumber   wbsCode   totalHours
--------------------------------
10             88            25   (from jobentry table)
10            552            70   (from jobentry table)
25             17           150   (from jobentry table)
25            374            38   (from jobentry table)
10             88            63   (from overtimejobentry table)
25            374            12   (from overtimejobentry table)
jobNumber   wbsCode   totalHours   totalOvertimeHours
----------------------------------------------------- 
10             88            25                    63
10            552            70                     0
25             17           150                     0
25            374            38                    12
结果:

SELECT 
    fk_jobNumber AS jobNumber,
    wbsCode,
    SUM(tue + wed + thu + fri + mon) AS totalHours
FROM
    jobentry
        INNER JOIN
    task ON task.taskID = jobentry.fk_taskID
        INNER JOIN
    wbscodeitem ON wbscodeitem.wbsCodeItemID = task.fk_wbsCodeItemID
        INNER JOIN
    job ON job.jobNumber = wbscodeitem.fk_jobNumber
GROUP BY fk_jobNumber , wbsCode 

UNION

/*Same SQL statement as above except it's for table overtimejobentry instead of jobentry*/
SELECT 
    fk_jobNumber AS jobNumber,
    wbsCode,
    SUM(tue + wed + thu + fri + sat + sun + mon) AS totalHours
FROM
    overtimejobentry
        INNER JOIN
    task ON task.taskID = overtimejobentry.fk_taskID
        INNER JOIN
    wbscodeitem ON wbscodeitem.wbsCodeItemID = task.fk_wbsCodeItemID
        INNER JOIN
    job ON job.jobNumber = wbscodeitem.fk_jobNumber
GROUP BY fk_jobNumber , wbsCode
jobNumber   wbsCode   totalHours
--------------------------------
10             88            25   (from jobentry table)
10            552            70   (from jobentry table)
25             17           150   (from jobentry table)
25            374            38   (from jobentry table)
10             88            63   (from overtimejobentry table)
25            374            12   (from overtimejobentry table)
jobNumber   wbsCode   totalHours   totalOvertimeHours
----------------------------------------------------- 
10             88            25                    63
10            552            70                     0
25             17           150                     0
25            374            38                    12
这就是我要做的:

SELECT 
    fk_jobNumber AS jobNumber,
    wbsCode,
    SUM(tue + wed + thu + fri + mon) AS totalHours
FROM
    jobentry
        INNER JOIN
    task ON task.taskID = jobentry.fk_taskID
        INNER JOIN
    wbscodeitem ON wbscodeitem.wbsCodeItemID = task.fk_wbsCodeItemID
        INNER JOIN
    job ON job.jobNumber = wbscodeitem.fk_jobNumber
GROUP BY fk_jobNumber , wbsCode 

UNION

/*Same SQL statement as above except it's for table overtimejobentry instead of jobentry*/
SELECT 
    fk_jobNumber AS jobNumber,
    wbsCode,
    SUM(tue + wed + thu + fri + sat + sun + mon) AS totalHours
FROM
    overtimejobentry
        INNER JOIN
    task ON task.taskID = overtimejobentry.fk_taskID
        INNER JOIN
    wbscodeitem ON wbscodeitem.wbsCodeItemID = task.fk_wbsCodeItemID
        INNER JOIN
    job ON job.jobNumber = wbscodeitem.fk_jobNumber
GROUP BY fk_jobNumber , wbsCode
jobNumber   wbsCode   totalHours
--------------------------------
10             88            25   (from jobentry table)
10            552            70   (from jobentry table)
25             17           150   (from jobentry table)
25            374            38   (from jobentry table)
10             88            63   (from overtimejobentry table)
25            374            12   (from overtimejobentry table)
jobNumber   wbsCode   totalHours   totalOvertimeHours
----------------------------------------------------- 
10             88            25                    63
10            552            70                     0
25             17           150                     0
25            374            38                    12

您可以使用透视将两种类型的小时数合并到每个作业编号和WBS代码的单个记录中。在下面的查询中,我添加了一个名为
type
的计算列,该列跟踪正常工作时间或加班时间的时间来源

SELECT t.jobNumber,
       t.wbsCode,
       MAX(CASE WHEN t.type = 'normal'   THEN totalHours END) AS totalHours,
       MAX(CASE WHEN t.type = 'overtime' THEN totalHours END) AS totalOvertimeHours
FROM
(
    SELECT fk_jobNumber AS jobNumber,
           wbsCode,
           SUM(tue + wed + thu + fri + mon) AS totalHours,
           'normal' AS type      -- remember which records come from normal hours
    FROM jobentry
    INNER JOIN task
        ON task.taskID = jobentry.fk_taskID
    INNER JOIN wbscodeitem
        ON wbscodeitem.wbsCodeItemID = task.fk_wbsCodeItemID
    INNER JOIN job
        ON job.jobNumber = wbscodeitem.fk_jobNumber
    GROUP BY fk_jobNumber, wbsCode 

    UNION        -- note: you might want to use UNION ALL here

    SELECT fk_jobNumber AS jobNumber,
           wbsCode,
           SUM(tue + wed + thu + fri + sat + sun + mon) AS totalHours,
           'overtime' AS type    -- remember which records come from overtime hours
    FROM overtimejobentry
    INNER JOIN task
        ON task.taskID = overtimejobentry.fk_taskID
    INNER JOIN wbscodeitem
        ON wbscodeitem.wbsCodeItemID = task.fk_wbsCodeItemID
    INNER JOIN job
        ON job.jobNumber = wbscodeitem.fk_jobNumber
    GROUP BY fk_jobNumber, wbsCode
) t
GROUP BY t.jobNumber,
         t.wbsCode

请注意,如上所述,使用子查询包装的一种可能的替代方法是将两个子查询连接在一起。这里的问题是,给定的作业编号和WBS代码组合可能会出现在其中一个中,但不会出现在另一个中。在这种情况下,我们可能不得不求助于完整的外部连接,MySQL没有内置支持。上面给出的答案很可能更易于阅读和维护。

感谢您的回复,尽管在查询结束时将
GROUP BY t.fk_jobNumber
更改为
GROUP BY t.jobNumber
,但它仍能正常工作。