在上面的FldID 52 =说明和FldID 54 = HistoryDetail
对于任何给定日期,输出应该是该日期的最后一个条目。列也需要成为行。 用户将提供2个日期。比如2010年3月2日和2010年3月3日。
因此上述案例中的输出应为
由于Rev 6在表A中没有FldID 52的条目,[占位符1]应该具有Rev 3中的单词(因为这是表A中FldID 52的Rev 6之前的最新内容)。
类似地,
由于Rev 6在表A中没有FldID 54的条目,[占位符2]应该具有Rev 5中的单词(因为这是表A中FldID 54的Rev 6之前的最新内容)。
由于Rev 8在表A中没有FldId 54的条目,[占位符3]应该具有Rev 7中的单词(因为这是表A中FldID 54的Rev 8之前的最新内容)。
我无法提出可以提供上述结果的查询。请帮忙。
更新
表B中字段的数据类型
答案 0 :(得分:1)
这基本上是分组最大查询和反向枢轴的组合。简单的方法是使用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
答案 1 :(得分:0)
SELECT
LAST(System.ChangedDate) as ChangedDate,
LAST(System.Rev) as Rev,
LAST(System.ChangedBy) as ChangedBy,
LAST(System.AssignedTO) AS AssignedTO,
LAST(System.IterationPath) AS IterationPath,
LAST(A1.Description) AS Description,
LAST(A2.Description) AS HistroyDetail
FROM TableB
JOIN TableA on TableB.Id=TableA.ID AND TableB.(datefunction)=TableA=(datefunction)
AND FldID=52 AS A1
JOIN TableA on TableB.Id=TableA.ID AND TableB.(datefunction)=TableA=(datefunction)
AND fldID=54 AS A2
WHERE (datefunction) >= (minimum date) and (datefunction) <= (minimum date);
ORDER BY ChangedDate
GROUP BY (datefunction)
将datefunction替换为提取日期的函数,并从datetime字段中忽略Time。 这将给出一个类似你想要的表格,但90度关闭。