我正在组建一个小公司仪表板,显示谁正在处理哪些项目,每个月。我正在尝试将两个相似的表组合在一起;一个Timesheets
和另一个Projected Hours
。
Timesheets
+---------+-------------+------------+-------+
| YearMo | Employee ID | Project ID | Hours |
+---------+-------------+------------+-------+
| 2018-01 | Joe | A | 50 |
| 2018-01 | Joe | B | 50 |
| 2018-01 | Joe | C | 50 |
| 2018-01 | Mary | A | 50 |
| 2018-01 | Mary | B | 50 |
| 2018-01 | Mary | C | 50 |
| 2018-02 | Joe | A | 50 |
| 2018-02 | Joe | C | 50 |
| 2018-02 | Mary | A | 50 |
| 2018-02 | Mary | B | 50 |
| 2018-02 | Mary | C | 50 |
+---------+-------------+------------+-------+
Projected Hours
+---------+-------------+------------+-------+
| YearMo | Employee ID | Project ID | Hours |
+---------+-------------+------------+-------+
| 2018-02 | Joe | A | 50 |
| 2018-02 | Mary | A | 50 |
| 2018-03 | Joe | A | 50 |
| 2018-03 | Joe | D | 50 |
| 2018-03 | Mary | A | 50 |
| 2018-03 | Mary | E | 50 |
| 2018-03 | Mary | C | 50 |
| 2018-04 | Joe | A | 50 |
| 2018-04 | Joe | B | 50 |
| 2018-04 | Joe | E | 50 |
| 2018-04 | Mary | F | 50 |
| 2018-04 | Mary | C | 50 |
| 2018-04 | Bob | A | 100 |
+---------+-------------+------------+-------+
Timesheets
和Projected
每月都会汇总,并且具有(YearMo
,Employee ID
和Project ID
)的唯一组合。 Projected Hours
可能有人在Timesheets上处理不同的项目集,并且可能会有新员工完全没有出现在Timesheets
中,但预计会在以后处理事情(例如“鲍勃“)。
我希望能够加入它们并显示如下结果:Desired Output(蓝色突出显示只是为了让它更容易查看)
基本上,对于每个项目,每月,我希望看到当前工作时间在一列中,以及预计的2小时(或更长)时间。因此,对于yearMo=2018-01
,Projected1
和Projected 2
为2018-02
和2018-03
的所有行,但对于yearMo=2018-02
,{{ 1}}和Projected1
是Projected 2
和2018-03
。我只希望2018-04
列包含yearMo
表中的月份,但我仍然需要包含员工可能没有在项目上记录时间表小时数的行,但是DO会在未来的时间内预测个月。
下面的代码是我的部分解决方案,它产生like this的内容,但它只包含Timesheets
中的行,省略Timesheets
为空的任何行。我知道Actual Hours
省略了我想要的其他行。我和UNIONS一起玩过,但我一直无法得到它。
LEFT JOIN
提前致谢!
答案 0 :(得分:0)
嗯,我想我能够得到一个解决方案。我不知道它是否效率最高,但这是我对任何感兴趣的人的解决方案:(我重新命名了一些字段,但它们应该是非常明显的。)有一件事我和#39;仍然紧张的是,我用了2个月预测的例子,但最终我想显示6个月。不完全确定6个UNIONS将如何执行。
SELECT min(displayMo) as displayMonth
, min(`ID Number`) as `Employee ID`
, min(`Project ID`) as `Project ID`
, MIN(CASE
WHEN displayMo = yearMonth
THEN sumHours
ELSE NULL
END
) AS `Timesheet Hours`
, SUM(CASE
WHEN displayMo = DATE_FORMAT(DATE_ADD(STR_TO_DATE(CONCAT(yearMonth,'-01'), '%Y-%m-%d'), INTERVAL -1 MONTH),'%Y-%m')
THEN sumHours
ELSE NULL
END
) AS `Projected Hours1`
, SUM(CASE
WHEN displayMo = DATE_FORMAT(DATE_ADD(STR_TO_DATE(CONCAT(yearMonth,'-01'), '%Y-%m-%d'), INTERVAL -2 MONTH),'%Y-%m')
THEN sumHours
ELSE NULL
END
) AS `Projected Hours2`
FROM (
SELECT a.yearMonth as displayMo, a.*
FROM Summary_Timesheet a
UNION
SELECT DATE_FORMAT(DATE_ADD(STR_TO_DATE(CONCAT(b.yearMonth,'-01'), '%Y-%m-%d'), INTERVAL -1 MONTH),'%Y-%m') as displayMo, b.*
FROM PROJECTED b
UNION
SELECT DATE_FORMAT(DATE_ADD(STR_TO_DATE(CONCAT(c.yearMonth,'-01'), '%Y-%m-%d'), INTERVAL -2 MONTH),'%Y-%m') as displayMo, c.*
FROM PROJECTED c
) merged
WHERE displayMo BETWEEN (SELECT MIN(ST.yearMonth) FROM Summary_Timesheet ST)
AND
(SELECT MAX(ST.yearMonth) FROM Summary_Timesheet ST)
GROUP BY `ID Number`, `Project ID`, displayMo
ORDER BY displayMo, `ID Number`, `Project ID`