2012-03-02 223 views
1

因为我在SQL中工作已经很久了,所以如果这是一个愚蠢的问题,很抱歉。汇总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中是从积压,任务到“冲刺”的一切。 “sprint”只是一个包含StartDate和EndDate的条目,用于记录您的Sprint开始/结束,并且还链接到所有任务也将进行的迭代。

所以,我想要的是上面提到的数据,按照Sprint的“StartDate”排序的Sprint的“Name”进行分组,这是所有Sprint在其之前的前向总和。

而这正是我想要把我的大脑吹出来的地方。

如果这是可能的,我只需要做更多的阅读,请让我知道要查找什么。我似乎无法通过子查询来实现这一功能,但也许我根本没有正确使用它们。

谢谢!

+0

我对TFS一无所知,但是这可以用SQL Server中的纯SQL解决,还是需要别的东西?此外,你能提供实际表格的样本数据吗?我不知道如何将前两组数据与实际表格联系起来:( – 2012-03-02 05:33:18

+0

您收到的答案有什么问题吗?10天没有任何反应,不是很好。 – Tomalak 2012-03-12 09:12:59

+0

我对此表示歉意延迟,托马拉克,但这份报告在我的生活中已经没有时间去尝试任何解决方法,请原谅任何我没有意识到的礼节违规行为。当我得到时间去尝试的时候报告回来 – 2012-03-12 17:14:15

回答

1

所以,这些答案都帮助我指导了我需要做的事情,但没有一个能够完全实现。下面是最终的解决方案,我发现:

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查询,但我一点都不知道。如果有人对此有任何意见,那会很棒。:)

+0

+1发布您自己的解决方案。 – Tomalak 2012-03-16 10:15:03

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 
0

这可以在SSRS很容易做到 - 只要输入您卷起值创建一列,然后输入公式类似以下内容在卷起列细节行细胞中的表达:

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

不幸的是,这并不能产生我想要的结果。它为我提供了所有冲刺中OriginalEstimate的总和,减去当前冲击。当我想要的是所有短跑运动员的原始素质总和时,减去以前所有跑步者的总和*,包括*这一个。有没有简单的方法来完成SSRS?我很想了解更多。 – 2012-03-12 17:32:25

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