Datediff на 2 строки таблицы с условием - PullRequest
0 голосов
/ 12 ноября 2019

Мои данные выглядят следующим образом

TicketID      OwnedbyTeamT       Createddate         ClosedDate
1234          A          
1234          A         01/01/2019            01/05/2019 
1234          A         10/05/2018            10/07/2018
1234          B         10/04/2019            10/08/2018
1234          finance   11/01/2018            11/11/2018
1234          B         12/02/2018

Теперь я хочу вычислить дату между закрытыми датами для команд A и B, если максимальная закрытая дата для команды A больше, чем максимальная закрытая дата для команды BЕсли оно меньше или равно нулю, я не хочу их видеть. Так, например, я хочу видеть только одну запись, подобную этой:

TicketID      (Datediff)result-days
 1234            86

, а для других билетов отобразить информацию. Например, если условия не выполняются, то:

TicketID      (Datediff)result-days
   2456            -1111111

Образец данных за 2456:

TicketID      OwnedbyTeamT       Createddate         ClosedDate
2456          A          
2456          A         10/01/2019            10/05/2019 
2456          B         08/05/2018            08/07/2018
2456          B         06/04/2019            06/08/2018
2456         finance    11/01/2018            11/11/2018
2456          B         12/02/2018

Я хочу увидеть разницу в днях между 01/05/2019 длякоманда A и

10/08/2018 для команды B.

Вот запрос, который я написал, однако все, что я вижу, это -1111111, любая помощь, пожалуйста?:

SELECT A.incidentid, 
       ( CASE 
           WHEN Max(B.[build validation]) <> 'No data' 
                AND Max(A.crfs) <> 'No data' 
                AND Max(B.[build validation]) < Max(A.crfs) THEN 
           Datediff(day, Max(B.[build validation]), Max(A.crfs)) 
           ELSE -1111111 
         END ) AS 'Days-CRF-diff' 
FROM   (SELECT DISTINCT incidentid, 
                        Iif(( ownedbyteam = 'B' 
                              AND titlet LIKE '%Build validation%' ), Cast( 
                        closeddatetimet AS NVARCHAR(255)), 'No data') AS 
                               'Build Validation' 
        FROM   incidentticketspecifics) B
       INNER JOIN (SELECT incidentid, 
                          Iif(( ownedbyteamt = 'B' 
                                 OR ownedbyteamt = 
                                    'Finance' ), 
                          Cast( 
                          closeddatetimet AS NVARCHAR(255)), 'No data') AS 
                          'CRFS' 
                   FROM   incidentticketspecifics 
                   GROUP  BY incidentid, 
                             ownedbyteamt, 
                             closeddatetimet) CRF 
               ON A.incidentid = B.incidentid 
GROUP  BY A.incidentid 

1 Ответ

1 голос
/ 12 ноября 2019

Надеюсь, вам поможет следующий ответ.

С двумя подзапросами для двух команд (A и B) указывается максимальная дата для каждого билета. Левое объединение между этими двумя таблицами выполняется для размещения этой информации в одной строке для выполнения DATEDIFF. Последнее предложение WHERE содержит строку с датами, большими для команды A, чем для команды B.

Пожалуйста, измените [YourDB] и [MytableName] в следующем коде с вашими именами.

--Select the items to be viewed in the final view along with the difference in days
SELECT A.[TicketID],A.[OwnedbyTeamT], A.[Max_DateA],B.[OwnedbyTeamT], B.[Max_DateB], DATEDIFF(dd,B.[Max_DateB],A.[Max_DateA]) AS My_Diff
FROM 
(
--The following subquery creates a table A with the max date for every project for team A
  SELECT [TicketID]
      ,[OwnedbyTeamT]
      ,MAX([ClosedDate]) AS Max_DateA
  FROM [YourDB].[dbo].[MytableName]
  GROUP BY [TicketID],[OwnedbyTeamT]
  HAVING [OwnedbyTeamT]='A')A
--A join between view A and B to bring the max dates for every project
  LEFT JOIN (
--The max date for every project for team B
  SELECT [TicketID]
      ,[OwnedbyTeamT]
      ,MAX([ClosedDate]) AS Max_DateB
  FROM [YourDB].[dbo].[MytableName]
  GROUP BY [TicketID],[OwnedbyTeamT]
  HAVING [OwnedbyTeamT]='B')B
  ON A.[TicketID]=B.[TicketID]
--Fill out the rows on the max dates for the teams 
  WHERE A.Max_DateA>B.Max_DateB

Вы могли бы сделать с PIVOT. Я оставляю рабочий пример.

SELECT [TicketID], "A", "B", DATEDIFF(dd,"B","A") AS My_Date_Diff
FROM
(
SELECT [TicketID],[OwnedbyTeamT],MAX([ClosedDate]) AS My_Max
  FROM [YourDB].[dbo].[MytableName]
  GROUP BY [TicketID],[OwnedbyTeamT]
  )Temp
  PIVOT
  (
  MAX(My_Max)
  FOR Temp.[OwnedbyTeamT] in ("A","B")
  )PIV
  WHERE "A">"B"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...