0

替代文字

在上面的 FldID 52 = Description 和 FldID 54 = HistoryDe​​tail

替代文字

对于任何给定的日期,输出应该是该日期的最后一个条目。列也需要变成行。用户将提供 2 个日期。比如说 2010 年 3 月 2 日和 2010 年 3 月 3 日。

所以上述情况下的输出应该是

替代文字

由于第 6 版在表 A 中没有 FldID 52 的条目,[占位符 1] 应该有来自第 3 版的字(因为这是表 A 中 FldID 52 的第 6 版之前的最新版本)。

同样,
由于第 6 版在表 A 中没有 FldID 54 的条目,[占位符 2] 应该有来自第 5 版的字(因为这是第 6 版之前表 A 中 FldID 54 的最新词)。

由于第 8 版在表 A 中没有 FldId 54 的条目,[占位符 3] 应该有来自第 7 版的单词(因为这是表 A 中 FldID 54 的第 8 版之前的最新版本)。

我无法提出可以给我上述结果的查询。请帮忙。

更新

表 B 中字段的数据类型

替代文字

4

2 回答 2

1

这基本上是分组最大查询和反向枢轴的组合。简单的方法是使用ROW_NUMBERand 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
于 2010-03-03T20:32:23.913 回答
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 字段中的时间的函数。这将给出一个像你想要的那样的表格,但是 90 度的关闭。

于 2010-03-03T20:27:29.013 回答