2012-03-02 219 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