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