Свернуть SQL-запрос? - PullRequest
       4

Свернуть SQL-запрос?

1 голос
/ 02 марта 2012

Прошло много лет с тех пор, как я работал в SQL, поэтому прошу прощения, если это глупый вопрос.

Я работаю с базой данных TFS и пытаюсь составить отчет с запросом по ней, чтобы получить сумму всего поля «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

Краткое описание:

«WorkItem» в TFS - это все, начиная с заданий, задач и заканчивая «спринтами». «Спринт» - это просто запись, которая содержит StartDate и EndDate для учета начала / конца вашего спринта, а также ссылки на итерацию, что будут выполнять все задачи.

Итак, мне нужны данные, упомянутые выше, сгруппированные по «имени» спринта, упорядоченному по «начальной дате спринта», то есть к сумме всех спринтов впереди.

И здесь я хочу выбить мозги.

Если это возможно, и мне просто нужно больше читать, пожалуйста, дайте мне знать, что искать. Кажется, я не могу сделать это с помощью подзапросов, но, возможно, я просто не правильно их использую.

Спасибо!

Ответы [ 4 ]

2 голосов
/ 14 марта 2012

Итак, все эти ответы помогли мне направиться к тому, что мне нужно было сделать, но ни один не был достаточно полным сам по себе. Вот окончательное решение, которое я нашел:

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 голос
/ 02 марта 2012
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
1 голос
/ 02 марта 2012

Вероятно, не самая лучшая производительность, но один из способов получить результаты, подобные тому, что вы показываете, - это использовать скалярный подзапрос в операторе 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 голосов
/ 02 марта 2012

Это можно сделать довольно легко в SSRS - просто создайте столбец для значения Roll Up, затем введите формулу, подобную следующей, в выражение для ячейки строки сведений в столбце Roll-Up:

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