В основном это комбинация максимального группового запроса и обратного пивота. Простой подход заключается в использовании ROW_NUMBER
и UNPIVOT
.
Я покажу вам, как это сделать на одно свидание. Чтобы сделать две даты, достаточно просто скопировать и вставить второй параметр даты и объединение в конце столбца FieldName
. Вы также не опубликовали никакой схемы описания, поэтому я предполагаю, что у вас есть таблица с именем FieldDescription
, которая отображает FldID
на соответствующее имя (например, HistoryDetail
).
;WITH A_CTE AS
(
SELECT
fd.FieldName, a.Words,
ROW_NUMBER() OVER (PARTITION BY a.FldID ORDER BY a.Rev DESC) AS RowNum
FROM TableA a
INNER JOIN FieldDescription fd
ON fd.FldID = a.FldID
WHERE AddedDate <= @Date
),
B_CTE AS
(
SELECT
IterationPath,
CAST(ChangedDate AS nvarchar(4000)) AS ChangedDate,
CAST(Rev AS nvarchar(4000)) AS Rev,
CAST(ChangedBy AS nvarchar(4000)) AS ChangedBy,
CAST(AssignedTo AS nvarchar(4000)) AS AssignedTo,
ROW_NUMBER() OVER
(
PARTITION BY Rev
ORDER BY ChangedDate DESC
) AS RowNum
FROM TableB
WHERE ChangedDate <= @Date
),
Props AS
(
SELECT PropertyName, PropertyValue
FROM B_CTE
UNPIVOT
(
PropertyValue
FOR PropertyName IN
(
IterationPath, ChangedDate, Rev, ChangedBy, AssignedTo
)
) AS u
WHERE RowNum = 1
)
SELECT FieldName, Words
FROM A_CTE
WHERE RowNum = 1
UNION ALL
SELECT PropertyName, PropertyValue
FROM Props