SQL-统计JIRA敏捷看板中的工作量

如果觉得这篇文章不错,请记得点赞、收藏和分享,也欢迎加我个人微信交流:craigyoung1985,请备注:姓名/城市/工作岗位。

– **************************************************** –
– 该脚本用来查询一个迭代中子任务的估算时间、已工作时间和剩余时间 –
– 作者:YY哥 (Email: craigyoung@live.cn) –
– 日期: 2017/2/20 –
– 适用场景:–
– 1.JIRA史诗故事(Epic)代表产品特性,即:大的用户估时或功能点,史诗故事被拆分为多个Stories(可独立开发、测试和发布的功能) –
– 2.JIRA故事(Story)代表产品功能点,故事被拆分为多个Technical Tasks(包含:开发任务和测试任务等) –
– 3.JIRA系统设置中开启了“时间跟踪”状态 –
– 4.JIRA敏捷看板配置中,预估->时间跟踪:剩余时间评估和花费时间(即:任务的时间追踪使用JIRA的剩余预估时间和已花费时间字段,燃尽图是以这两个字段为基础进行展开的)–
– 5.JIRA工作流:Open->In Progress->Resolved->Closed->Reopened->In Progress->… –
– *************************************************** –
在这里插入图片描述

#迭代名称
DECLARE @Sprint VARCHAR(100);
SET @Sprint = “XXX”;

#1.查询迭代中每个产品特性的剩余工作量等
SELECT epic.summary “产品特性Epic”,
SUM(CASE WHEN task.issuestatus IN (1,3,4) THEN task.timeestimate/3600
ELSE 0 END) AS “剩余工作量(小时)”,
SUM(task.timeoriginalestimate/3600) “总工作量(小时)”,
– 燃尽图累计工时的计算规则:1.技术任务为Resolved或Closed状态,使用:总工作量(原预估时间);2.否则,当已工作时间大于总工作量时,使用:总工作量(原预估时间),小于则使用:已工作时间
SUM(CASE task.issuestatus
WHEN 5 THEN
IFNULL(task.timeoriginalestimate,0)
WHEN 6 THEN
IFNULL(task.timeoriginalestimate,0)
ELSE
IF(IFNULL(task.timespent,0) >= task.timeoriginalestimate, task.timeoriginalestimate, IFNULL(task.timespent,0))
END)/3600 AS “已完成工作量(小时)”,
– 完成率 = 已完成工作量/总工作量(原预估时间)
CONCAT(LEFT(SUM(CASE task.issuestatus
WHEN 5 THEN
IFNULL(task.timeoriginalestimate,0)
WHEN 6 THEN
IFNULL(task.timeoriginalestimate,0)
ELSE
IF(IFNULL(task.timespent,0) >= task.timeoriginalestimate, task.timeoriginalestimate, IFNULL(task.timespent,0))
END)/3600/SUM(task.timeoriginalestimate/3600) * 100, 4), ‘%’) “完成率%”,
SUM(IFNULL(task.timespent/3600,0)) “实际工作量(小时)”
FROM customfieldvalue AS c
LEFT OUTER JOIN jiraissue story ON story.ID = c.ISSUE
LEFT OUTER JOIN AO_60DB71_SPRINT sprint ON sprint.ID = c.STRINGVALUE
LEFT JOIN issuetype it ON it.id = story.issuetype
LEFT JOIN issuelink stlink ON stlink.source = story.id
LEFT JOIN jiraissue task ON task.id = stlink.destination
LEFT JOIN issuetype itd ON itd.id = task.issuetype
LEFT JOIN issuelink eslink ON eslink.destination = story.id
LEFT JOIN jiraissue epic ON epic.id = eslink.source
WHERE stlink.linktype = 10100 AND eslink.linktype = 10200 AND CUSTOMFIELD = 10005
AND sprint.NAME = @Sprint
GROUP BY epic.issuenum
ORDER BY SUM(task.timeestimate/3600) DESC;

#2.查询迭代中每个经办人的剩余工作量等
SELECT task.ASSIGNEE “经办人”,
SUM(CASE WHEN task.issuestatus IN (1,3,4) THEN task.timeestimate/3600
ELSE 0 END) AS “剩余工作量(小时)”,
SUM(task.timeoriginalestimate/3600) “总工作量(小时)”,
SUM(CASE task.issuestatus
WHEN 5 THEN
IFNULL(task.timeoriginalestimate,0)
WHEN 6 THEN
IFNULL(task.timeoriginalestimate,0)
ELSE
IF(IFNULL(task.timespent,0) >= task.timeoriginalestimate, task.timeoriginalestimate, IFNULL(task.timespent,0))
END)/3600 AS “已完成工作量(小时)”,
SUM(IFNULL(task.timespent/3600,0)) “实际工作量(小时)”
FROM customfieldvalue AS c
LEFT OUTER JOIN jiraissue story ON story.ID = c.ISSUE
LEFT OUTER JOIN AO_60DB71_SPRINT sprint ON sprint.ID = c.STRINGVALUE
LEFT JOIN issuetype it ON it.id = story.issuetype
LEFT JOIN issuelink stlink ON stlink.source = story.id
LEFT JOIN jiraissue task ON task.id = stlink.destination
LEFT JOIN issuetype itd ON itd.id = task.issuetype
LEFT JOIN issuelink eslink ON eslink.destination = story.id
LEFT JOIN jiraissue epic ON epic.id = eslink.source
WHERE stlink.linktype = 10100 AND eslink.linktype = 10200
AND sprint.NAME = @Sprint
GROUP BY task.assignee
ORDER BY SUM(task.timeestimate/3600) DESC;

#3.查询迭代中每个经办人对应的产品特性的剩余工作量等
SELECT epic.summary “产品特性Epic”,
task.ASSIGNEE “经办人”,
SUM(CASE WHEN task.issuestatus IN (1,3,4) THEN task.timeestimate/3600
ELSE 0 END) AS “剩余工作量(小时)”,
SUM(task.timeoriginalestimate/3600) “总工作量(小时)”,
SUM(CASE task.issuestatus
WHEN 5 THEN
IFNULL(task.timeoriginalestimate,0)
WHEN 6 THEN
IFNULL(task.timeoriginalestimate,0)
ELSE
IF(IFNULL(task.timespent,0) >= task.timeoriginalestimate, task.timeoriginalestimate, IFNULL(task.timespent,0))
END)/3600 AS “已完成工作量(小时)”,
SUM(IFNULL(task.timespent/3600,0)) “实际工作量(小时)”
FROM customfieldvalue AS c
LEFT OUTER JOIN jiraissue story ON story.ID = c.ISSUE
LEFT OUTER JOIN AO_60DB71_SPRINT sprint ON sprint.ID = c.STRINGVALUE
LEFT JOIN issuetype it ON it.id = story.issuetype
LEFT JOIN issuelink stlink ON stlink.source = story.id
LEFT JOIN jiraissue task ON task.id = stlink.destination
LEFT JOIN issuetype itd ON itd.id = task.issuetype
LEFT JOIN issuelink eslink ON eslink.destination = story.id
LEFT JOIN jiraissue epic ON epic.id = eslink.source
WHERE stlink.linktype = 10100 AND eslink.linktype = 10200
AND sprint.NAME = @Sprint
GROUP BY epic.summary, task.assignee
ORDER BY epic.summary, SUM(task.timeestimate/3600) DESC, task.assignee;

#4.查询迭代中任务工作量详情:产品特性Epic->故事Story->技术任务Technical Tasks
SELECT epic.issuenum “Epic Number”, epic.summary “产品特性Epic”,
story.issuenum “Story Number”, story.summary “故事”, it.pname,
task.issuenum “Technical Task Number”, task.summary “技术任务”, itd.pname,
isd.pname “任务状态”, task.ASSIGNEE “经办人”,
task.timeestimate/3600 “剩余工作量(小时)”, task.timeoriginalestimate/3600 “总工作量(小时)”, task.timespent/3600 “实际工作量(小时)”
FROM customfieldvalue AS c
LEFT OUTER JOIN jiraissue story ON story.ID = c.ISSUE
LEFT OUTER JOIN AO_60DB71_SPRINT sprint ON sprint.ID = c.STRINGVALUE
LEFT JOIN issuetype it ON it.id = story.issuetype
LEFT JOIN issuelink stlink ON stlink.source = story.id
LEFT JOIN jiraissue task ON task.id = stlink.destination
LEFT JOIN issuetype itd ON itd.id = task.issuetype
LEFT JOIN issuelink eslink ON eslink.destination = story.id
LEFT JOIN jiraissue epic ON epic.id = eslink.source
LEFT JOIN issuestatus isd ON task.issuestatus = isd.id
WHERE stlink.linktype = 10100 AND eslink.linktype = 10200
AND sprint.NAME = @Sprint
#AND task.ASSIGNEE = “peizilong”
ORDER BY task.ASSIGNEE, isd.id, epic.issuenum, story.issuenum, task.issuenum;

– **************************************************** –
– 5.当故事Story没继续拆分成技术任务时,查询迭代中每个产品特性的剩余工作量等 –
– **************************************************** –
SELECT epic.summary “产品特性Epic”,
SUM(CASE WHEN story.issuestatus IN (1,3,4) THEN story.timeestimate/3600
ELSE 0 END) AS “剩余工作量(小时)”,
SUM(story.timeoriginalestimate/3600) “总工作量(小时)”,
SUM(CASE story.issuestatus
WHEN 5 THEN
IFNULL(story.timeoriginalestimate,0)
WHEN 6 THEN
IFNULL(story.timeoriginalestimate,0)
ELSE
IF(IFNULL(story.timespent,0) >= story.timeoriginalestimate, story.timeoriginalestimate, IFNULL(story.timespent,0))
END)/3600 AS “已完成工作量(小时)”,
CONCAT(LEFT(SUM(CASE story.issuestatus
WHEN 5 THEN
IFNULL(story.timeoriginalestimate,0)
WHEN 6 THEN
IFNULL(story.timeoriginalestimate,0)
ELSE
IF(IFNULL(story.timespent,0) >= story.timeoriginalestimate, story.timeoriginalestimate, IFNULL(story.timespent,0))
END)/3600/SUM(story.timeoriginalestimate/3600) * 100, 4), ‘%’) “完成率%”,
SUM(IFNULL(story.timespent/3600,0)) “实际工作量(小时)”
FROM customfieldvalue AS c
LEFT OUTER JOIN jiraissue story ON story.ID = c.ISSUE
LEFT OUTER JOIN AO_60DB71_SPRINT sprint ON sprint.ID = c.STRINGVALUE
LEFT JOIN issuetype it ON it.id = story.issuetype
LEFT JOIN issuelink stlink ON stlink.source = story.id
LEFT JOIN issuelink eslink ON eslink.destination = story.id
LEFT JOIN jiraissue epic ON epic.id = eslink.source
WHERE eslink.linktype = 10200 AND CUSTOMFIELD = 10005
AND sprint.NAME = @Sprint
GROUP BY epic.issuenum;

– **************************************************** –
– 6.当故事Story没继续拆分成技术任务时,查询迭代中每个经办人的剩余工作量等 –
– **************************************************** –
SELECT story.ASSIGNEE “经办人”,
SUM(CASE WHEN story.issuestatus IN (1,3,4) THEN story.timeestimate/3600
ELSE 0 END) AS “剩余工作量(小时)”,
SUM(story.timeoriginalestimate/3600) “总工作量(小时)”,
SUM(CASE story.issuestatus
WHEN 5 THEN
IFNULL(story.timeoriginalestimate,0)
WHEN 6 THEN
IFNULL(story.timeoriginalestimate,0)
ELSE
IF(IFNULL(story.timespent,0) >= story.timeoriginalestimate, story.timeoriginalestimate, IFNULL(story.timespent,0))
END)/3600 AS “已完成工作量(小时)”,
SUM(IFNULL(story.timespent/3600,0)) “实际工作量(小时)”
FROM customfieldvalue AS c
LEFT OUTER JOIN jiraissue story ON story.ID = c.ISSUE
LEFT OUTER JOIN AO_60DB71_SPRINT sprint ON sprint.ID = c.STRINGVALUE
LEFT JOIN issuetype it ON it.id = story.issuetype
LEFT JOIN issuelink stlink ON stlink.source = story.id
LEFT JOIN issuelink eslink ON eslink.destination = story.id
LEFT JOIN jiraissue epic ON epic.id = eslink.source
WHERE eslink.linktype = 10200
AND sprint.NAME = @Sprint
GROUP BY story.assignee
ORDER BY SUM(story.timeoriginalestimate/3600) DESC;


欢迎加我个人微信交流 craigyoung1985,一起学习和交流。请备注:姓名/城市/工作岗位,我可以拉到Jira和Confluence中国社区群。
  • 6
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Docker-compose是一个用于定义和运行多个容器应用的工具,能够简化容器化应用的部署与管理过程。而Jira和Confluence是Atlassian公司开发的两个知名的协同办公工具。 Jira是一个专业的项目管理工具,可以帮助团队进行需求管理、任务分配、缺陷跟踪等工作。使用Docker-compose可以方便地部署Jira容器,并配置所需的环境参数,例如数据库连接、内存分配等。通过定义相关的容器服务,可以实现快速搭建和管理Jira应用,减少了环境配置和部署的工作量。 Confluence是一个企业知识管理平台,可以用于团队和组织的文档协作、知识共享、项目文档等。与Jira类似,使用Docker-compose可以轻松地配置和部署Confluence容器,并设置相关的容器服务。通过这种方式,可以快速创建和管理Confluence应用,提高了协同办公的效率。 使用Docker-compose来部署Jira和Confluence有以下几个优点: 1. 声明式配置:通过Docker-compose的YAML文件,可以清晰地定义Jira和Confluence的各种配置项,使部署过程更加可控和可重复。 2. 快速部署和扩展:Docker-compose可以同时启动多个容器实例,可以根据实际需求轻松扩容和缩容。这样可以在需要时快速部署新的Jira和Confluence实例,提高应用的可用性和性能。 3. 环境隔离:Docker容器提供了强大的隔离性,每个应用实例都运行在独立的容器内。这样可以避免应用之间的相互影响,增强了应用的稳定性和安全性。 总之,通过使用Docker-compose来部署Jira和Confluence,可以简化应用的部署和管理,提高开发和协同办公的效率,并且具备良好的可扩展性和隔离性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值