汇总SQL查询?

时间:2012-03-02 04:16:36

标签: sql reporting-services tfs subquery

自从我在SQL工作以来已经很久了,所以如果这是一个愚蠢的问题,请道歉。

我正在使用TFS数据库,我正在尝试对其进行查询报告,以获取当前sprint迭代和转发中的项目的所有“OriginalEstimate”字段的总和。

即,如果数据的布局如下:

Sprint Name | Original Estimate Total       
Sprint #1:  | 10
Sprint #2:  | 20
Sprint #3:  | 30
Sprint #4:  | 40

我想要返回一个如下所示的数据集:

Sprint Name | Original Estimate Total       
Sprint #1:  | 90
Sprint #2:  | 70
Sprint #3:  | 40
Sprint #4:  | 0

首先,我甚至不知道使用SQL是否可以实现上述功能。如果没有,请告诉我。 :)

如果事情变得更加开始,我是否了解如何在TFS SQL服务器表结构中执行此操作。我不能修改结构,因此非常感谢任何关于如何实现这一点的想法。

如果你不熟悉TFS的数据库布局,这里有一个快速的表格摘要,剪下来并重新命名,以便更容易理解:

(Table) Iteration
-----------------
IterationName
IterationGuid

(Table) WorkItem
----------------
ID
Name
IterationGUID      // Relates to Iteration table, above
StartDate
OriginalEstimate   // The field I care about, only valid on 'Task' in our case.
WorkItemType       // Used to distinguish the type, for our purposes assume only 'Task' and 'Sprint' exist

简要说明:

TFS中的“WorkItem”是从积压,任务到“冲刺”的所有内容。 'sprint'只是一个包含StartDate和EndDate的条目,用于计算您的sprint开始/结束,还链接到所有任务也将进行的迭代。

所以,我想要的是上面提到的数据,按照Sprint的“名称”分组,由Sprint的“StartDate”排序,即前面所有冲刺的前向和。

这就是我想要绞尽脑汁的地方。

如果可以,我只需要做更多的阅读,请告诉我要查找的内容。我似乎无法使用子查询进行此操作,但也许我只是没有正确使用它们。

谢谢!

4 个答案:

答案 0 :(得分:2)

所以,这些答案都帮助我引导我需要做的事情,但没有一个是完全自己的。这是我找到的最终解决方案:

SELECT        Name, Microsoft_VSTS_Scheduling_StartDate AS StartDate,
                         (SELECT        SUM(Microsoft_VSTS_Scheduling_OriginalEstimate) AS OriginalEstimateTotal
                           FROM            CurrentWorkItemView AS wi1
                           WHERE        (IterationPath IN
                                                         (SELECT        IterationPath
                                                           FROM            CurrentWorkItemView AS wi2
                                                           WHERE        (WorkItemType = 'Sprint') AND 
                                                                                     (Microsoft_VSTS_Scheduling_StartDate > wi3.Microsoft_VSTS_Scheduling_StartDate))) AND (State NOT IN ('Removed'))) 
                     AS OriginalEstimateTotal
FROM            CurrentWorkItemView AS wi3
WHERE        (WorkItemType = 'Sprint') AND (State <> 'Removed')
ORDER BY StartDate

理想情况下,我想将此查询移至MDX查询,但我并不是最模糊的。如果有人对此有任何意见,那就太好了。 :)

答案 1 :(得分:1)

可能不是最佳性能,但获得结果的一种方法就是在select语句中使用标量子查询。您的样本和结果数据似乎与您的解释不同。所以,我只是按照你的样本数据,即我将所有任务的值加总,大于当前任务。

SELECT name,
       (SELECT SUM(originalestimate) AS oe
        FROM   workitem AS wi1
        WHERE  wi1.id = wi2.id
               AND wi1.startdate > wi2.startdate) AS oe_total
FROM   workitem AS wi2
WHERE  workitemtype = 'Task'
ORDER  BY name,
          startdate  

答案 2 :(得分:1)

SELECT
  wi.id, wi.name,
  SUM(ahead.originalestimate) ahead_estimate
FROM
  workitem wi
  INNER JOIN workitem ahead ON ahead.id = wi.id 
                               AND ahead.startdate > wi.startdate
WHERE
  workitemtype = 'Task'
GROUP BY
  wi.id, wi.name
ORDER BY
  wi.name

答案 3 :(得分:0)

这可以在SSRS中轻松完成 - 只需为您的汇总值创建一列,然后在汇总列中的详细行单元格的表达式中输入如下公式:

=Sum(Fields!OriginalEstimate.Value, "DataSet1")-Fields!OriginalEstimate.Value