试图将两个表中的+ pivot(?)组合在一起,每个表都不存在另一个表中的值

时间:2018-03-09 03:07:39

标签: mysql

我正在组建一个小公司仪表板,显示谁正在处理哪些项目,每个月。我正在尝试将两个相似的表组合在一起;一个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 |
+---------+-------------+------------+-------+

TimesheetsProjected每月都会汇总,并且具有(YearMoEmployee IDProject ID)的唯一组合。 Projected Hours可能有人在Timesheets上处理不同的项目集,并且可能会有新员工完全没有出现在Timesheets中,但预计会在以后处理事情(例如“鲍勃“)。

我希望能够加入它们并显示如下结果:Desired Output(蓝色突出显示只是为了让它更容易查看)

基本上,对于每个项目,每月,我希望看到当前工作时间在一列中,以及预计的2小时(或更长)时间。因此,对于yearMo=2018-01Projected1Projected 22018-022018-03的所有行,但对于yearMo=2018-02,{{ 1}}和Projected1Projected 22018-03。我只希望2018-04列包含yearMo表中的月份,但我仍然需要包含员工可能没有在项目上记录时间表小时数的行,但是DO会在未来的时间内预测个月。

下面的代码是我的部分解决方案,它产生like this的内容,但它只包含Timesheets中的行,省略Timesheets为空的任何行。我知道Actual Hours省略了我想要的其他行。我和UNIONS一起玩过,但我一直无法得到它。

LEFT JOIN

提前致谢!

1 个答案:

答案 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`