SQL - Итоговая сумма (совокупное количество закрытых задач) по месяцам - PullRequest
0 голосов
/ 28 февраля 2019

Я пытаюсь показать совокупное количество всех закрытых заданий на 2019 год, сгруппированных по проектам.Я сделал, я рассматриваю, и это работает частично.Но чего я хочу достичь, так это когда у меня нет закрытых задач в 2019 году, но у меня они есть в предыдущие годы, я хочу добавить число этих задач к значению января 2019 года.

Я сделал этопредставление, которое считает все задачи совокупными:

SELECT 
    *, 
    SUM(a.cnt)  OVER (PARTITION BY Project ORDER BY Jahr,Monat,Project RANGE UNBOUNDED PRECEDING) as cum_cnt_of_tasks
FROM 
    (
    SELECT count(distinct [StoryID])as cnt,datepart(month,[Story_Resolutiondate]) as Monat, datepart(year,[Story_Resolutiondate]) as Jahr,v.ProjectID as  Project
    FROM [Story]s 
    join [Epic]e on s.EpicID=e.EpicID
    join [Project]v on e.ProjectID=v.ProjectID
    group by datepart(month,[Story_Resolutiondate]) ,datepart(year,[Story_Resolutiondate]),v.ProjectID

  ) AS a 

Это результат:

Monat   Jahr       Project         cum_cnt_of_tasks
  6     2017        259052               1
  7     2017        259052               2
  8     2017        259052               3
  9     2017        259052               4
  1     2019        255403               4 
  2     2019        255405               2

Но я хочу превратить это в:

Monat   Jahr       Project         cum_cnt_of_tasks
  1     2019        259052               4
  1     2019        255403               4 
  2     2019        255405               2

Так что я долженвозьмите последнее совокупное значение для проекта 259052 за предыдущие годы и отобразите его в значение для января 2019 года:

Таким образом, последнее совокупное значение для проекта 259052 было в сентябре (Monat = 9) 2017.Я хочу сопоставить это значение с январем 2019 года.

Monat   Jahr       Project         cum_cnt_of_tasks
  6     2017        259052               1
  7     2017        259052               2
  8     2017        259052               3
 *9     2017        259052               4*

                INTO

Monat   Jahr       Project         cum_cnt_of_tasks
 *1     2019        259052               4*

@ Гордон Линофф Это работает, если у меня нет данных после января 2019 года, но если они у меня есть, то я получаю из этого набора:

   M      J    Project  cnt
    7   2018    17323   34
    8   2018    17323   36
    9   2018    17323   37
    10  2018    17323   40
    11  2018    17323   41
    12  2018    17323   43
    1   2019    17323   44
    2   2019    17323   47

этот набор:

m     j    Project     cnt
2   2019    17323   47

Но мне действительно нужно:

m      j    Project  cnt
1   2019    17323     44 
2   2019    17323     47

Так что, если январь 2019 уже есть в наборе данных, я теряю его с вашим запросом

Ответы [ 2 ]

0 голосов
/ 28 февраля 2019

Я думаю, что вы можете сделать это с помощью одной агрегации:

select (case when max(Story_Resolutiondate) < '2019-01-01' then 1 else month(max(Story_Resolutiondate))
        end) as monat,
       (case when max(Story_Resolutiondate) < '2019-01-01' then 2019 else year(max(Story_Resolutiondate))
        end) as jarh,
       v.projectId,
       count(distinct StoryId)
from [Story] s join
     [Epic] e 
     on s.EpicID = e.EpicID join
     [Project] v 
     on e.ProjectID = v.ProjectID
group by v.ProjectId;

Я не на 100% считаю то, что вы хотите.Ваши данные показывают, что вы хотите считать месяцев , но ваш запрос имеет другую логику.Либо вполне выполнимо.

РЕДАКТИРОВАТЬ:

Я думаю, union all может делать то, что вы хотите:

select 1 as monat, 2019 as jarh, v.projectId, count(distinct StoryId)
from [Story] s join
     [Epic] e 
     on s.EpicID = e.EpicID join
     [Project] v 
     on e.ProjectID = v.ProjectID
group by v.ProjectId
having max(Story_Resolutiondate) < '2019-01-01'
union all
select month(Story_Resolutiondate) as monat, 
       year(Story_Resolutiondate) as jahr,
       v.projectId, count(distinct StoryId)
from [Story] s join
     [Epic] e 
     on s.EpicID = e.EpicID join
     [Project] v 
     on e.ProjectID = v.ProjectID
where Story_Resolutiondate >= '2019-01-01'
group by v.ProjectId, year(Story_Resolutiondate), month(Story_Resolutiondate)
0 голосов
/ 28 февраля 2019

Используйте GROUP BY и SUM():

SELECT
  q.Monat
, q.Jahr
, q.Project
, SUM(q.cum_cnt_of_tasks) SumCnt_of_tasks
FROM
(
SELECT 
    *, 
    SUM(a.cnt)  OVER (PARTITION BY Project ORDER BY Jahr,Monat,Project RANGE 
        UNBOUNDED PRECEDING) as cum_cnt_of_tasks
FROM 
    (
    SELECT 
    count(distinct [StoryID])as cnt
    , datepart(month,[Story_Resolutiondate]) as Monat
    , datepart(year,[Story_Resolutiondate]) as Jahr
    ,v.ProjectID as  Project
    FROM [Story]s 
    join [Epic]e on s.EpicID=e.EpicID
    join [Project]v on e.ProjectID=v.ProjectID
    group by  datepart(month,[Story_Resolutiondate]) 
             ,datepart(year,[Story_Resolutiondate])
             ,v.ProjectID    
  ) AS a 
)q
GROUP BY   q.Monat
         , q.Jahr
         , q.Project
         , q.cum_cnt_of_tasks

ОБНОВЛЕНИЕ:

Попробуйте использовать следующий запрос:

SELECT 
  CASE 
    WHEN t.Jahr = 2017 THEN 1
    ELSE MAX(t.Monat)
  END AS Monat     
, CASE 
    WHEN t.Jahr = 2017 THEN 2019
    ELSE t.Jahr
  END AS Jahr
, t.Project
, COUNT(t.cum_cnt_of_tasks) Cnt
FROM @Table t
GROUP BY 
  t.Jahr
, t.Project

Пример данных:

DECLARE @Table TABLE
(
    Monat  INT,
    Jahr INT,
    Project INT,
    cum_cnt_of_tasks INT
)

INSERT INTO @Table
(
    Monat,
    Jahr,
    Project,
    cum_cnt_of_tasks
)
VALUES
  (   6,     2017,        259052,               1)
, (   7,     2017,        259052,               2)
, (   8,     2017,        259052,               3)
, (   9,     2017,        259052,               4)
, (   1,     2019,        255403,               4) 
, (   2,     2019,        255405,               2)

ВЫХОД:

Monat   Jahr    Project   Cnt
1       2019    255403     1
2       2019    255405     1
1       2019    259052     4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...