2017-03-03 97 views
0

要产生工作量预测,我需要合并“预订时间”(此处为“sapactivities”)和“计划时间”(这里为计划活动)的表格。输出应包含独特的日/资源/通知组合所花费的每日总时间,优先于“已预订”而非“已计划”时间。根据条件输出没有重复日期的行

SELECT date_format(result.CurrentDate, '%a, %d.%m.%Y'), 
    result.Resource, result.Notification, result.Hours, result.Effort 
FROM 
(SELECT sapactivities.start AS 'CurrentDate', 
     sapactivities.activitytext AS 'Resource', 
     sapactivities.notification AS 'Notification', 
     SUM(TIMESTAMPDIFF(MINUTE,start,end)/60) AS 'Hours', 
     'Booked' AS 'Effort' 
    FROM work.sapactivities 
    GROUP BY sapactivities.notification,sapactivities.activitytext,sapactivities.start 

UNION ALL 

SELECT plannedactivities.activitydate AS 'CurrentDate', 
    /*CONCAT_WS(' ',resource.firstname,resource.lastname) AS 'Resource',*/ 
    resource.sapActivityText AS 'Resource', 
    notification.notification AS 'Notification', 
    plannedactivities.hours AS 'Hours', 
    'Planned' AS 'Effort' 
FROM work.plannedactivities 
LEFT JOIN work.notification ON plannedactivities.idNotification = notification.id 
LEFT JOIN work.resource ON plannedactivities.idResource = resource.id) AS result 
GROUP BY result.Resource, result.Notification, DATE (result.CurrentDate), 
    CASE WHEN result.Effort = 'Booked' THEN 'Booked' ELSE 'Planned' END 
ORDER BY result.Resource,result.CurrentDate ASC; 

但是我仍然通过“预订”和“计划”努力获得重复的行/资源/通知行。我在外部GROUP BY子句中尝试了多种方法,但没有得到我期待的结果...任何想法?

回答

0

不应该像你这样的SELECT语句吗?

SELECT 
date_format(result.CurrentDate, '%a, %d.%m.%Y'), 
result.Resource, result.Notification, result.Hours, 
(CASE WHEN result.Effort = 'Booked' THEN 'Booked' ELSE 'Planned' END) 
FROM ... 

顺便说一句,你只剩下加入一列,你不应该在联合之前做两列的左连接吗?

希望它可以帮助...这将是好了很多,如果我们有真正的信息来试试吧:d

+0

完美的作品。你对LEFT JOINS的评论我没有真正得到 - 我认为这两个JOIN都被执行,因为第二个后面有一个右括号。同样在结果资源列正确给予 – formatter

+0

很高兴我可以帮助:)没有注意到第二个后面的支架;) –

0

一般来说,可以用ROW_NUMBER仿真来实现看http://www.mysqltutorial.org/mysql-row_number/。提供'Booked'<'Planned'Hours不会超过百万移动的情况下进入SELECT语句,THX当这一招会做

Select CurrentDate, Resource, Notification, min(Hours) MOD 100000, min(Effort) 
FROM (

    SELECT sapactivities.start AS 'CurrentDate', 
      sapactivities.activitytext AS 'Resource', 
      sapactivities.notification AS 'Notification', 
      1000000 + SUM(TIMESTAMPDIFF(MINUTE,start,end)/60) AS 'Hours', 
      'Booked' AS 'Effort' 
     FROM work.sapactivities 
     GROUP BY sapactivities.notification,sapactivities.activitytext,sapactivities.start 

    UNION ALL 

    SELECT plannedactivities.activitydate AS 'CurrentDate', 
     /*CONCAT_WS(' ',resource.firstname,resource.lastname) AS 'Resource',*/ 
     resource.sapActivityText AS 'Resource', 
     notification.notification AS 'Notification', 
     2000000 + plannedactivities.hours AS 'Hours', 
     'Planned' AS 'Effort' 
    FROM work.plannedactivities 
    LEFT JOIN work.notification ON plannedactivities.idNotification = notification.id 
    LEFT JOIN work.resource ON plannedactivities.idResource = resource.id 

) AS result 
GROUP BY result.Resource, result.Notification, DATE (result.CurrentDate) 
+0

非常好的方法,也适用于我的情况。谢谢 – formatter