Sql 使用SSMS'08中的表数据作为'03访问表单头,并将多行合并为一行。审计表

Sql 使用SSMS'08中的表数据作为'03访问表单头,并将多行合并为一行。审计表,sql,sql-server,vba,sql-server-2008,ms-access,Sql,Sql Server,Vba,Sql Server 2008,Ms Access,我有一个审计表,其中显示的数据如下: PK FieldName OldValue NewValue UpdateDate ---------------------------------------------------------------------- <orderline=485040867> qtyrec 0 1 2016-05-03 09:09

我有一个审计表,其中显示的数据如下:

 PK                      FieldName  OldValue    NewValue    UpdateDate   
 ----------------------------------------------------------------------  

 <orderline=485040867>   qtyrec     0           1           2016-05-03 09:09:04.223  
 <orderline=485040867>   statcode   RD          RC          2016-05-03 09:09:04.223  
 <orderline=485040867>   qty        NULL        1           2016-04-28 03:24:57.490  
 <orderline=485040867>   qtyrec     NULL        0           2016-04-28 03:24:57.490  
 <orderline=485040867>   statcode   NULL        NP          2016-04-28 03:24:57.490  
 <orderline=485040867>   batch      NULL        MRP280416A  2016-04-28 17:01:57.160  
 <orderline=485040867>   statcode   NP          OR          2016-04-28 17:01:57.160  
 <orderline=485040867>   statcode   OR          RD          2016-04-29 05:06:29.100   

我已将您的示例输入用于如下变量表:

DECLARE @t TABLE (
    PK NVARCHAR(255),
    FieldName NVARCHAR(255),
    OldValue NVARCHAR(255),
    NewValue NVARCHAR(255),
    UpdateDate DATETIME
)

INSERT INTO @t VALUES 
    ('<orderline=485040867>', 'qty', NULL, '1', '2016-04-28 03:24:57.490'),
    ('<orderline=485040867>', 'qtyrec', NULL, '0', '2016-04-28 03:24:57.490'),
    ('<orderline=485040867>', 'statcode', NULL, 'NP', '2016-04-28 03:24:57.490'),
    ('<orderline=485040867>', 'qtyrec', '0', '1', '2016-05-03 09:09:04.223'),
    ('<orderline=485040867>', 'statcode', 'RD', 'RC', '2016-05-03 09:09:04.223'),
    ('<orderline=485040867>', 'batch', NULL, 'MRP280416A', '2016-04-28 17:01:57.160'),
    ('<orderline=485040867>', 'statcode', 'NP', 'OR', '2016-04-28 17:01:57.160'),
    ('<orderline=485040867>', 'statcode', 'OR', 'RD', '2016-04-29 05:06:29.100');
SELECT a.PK
, (SELECT TOP 1 NewValue
    FROM @t b
    WHERE b.FieldName = 'qty'
    AND b.PK = a.PK
    AND b.UpdateDate <= a.UpdateDate
    ORDER BY b.UpdateDate DESC) AS qty
, (SELECT TOP 1 NewValue
    FROM @t b
    WHERE b.FieldName = 'qtyrec'
    AND b.PK = a.PK
    AND b.UpdateDate <= a.UpdateDate
    ORDER BY b.UpdateDate DESC) AS qtyrec
, (SELECT TOP 1 NewValue
    FROM @t b
    WHERE b.FieldName = 'statcode'
    AND b.PK = a.PK
    AND b.UpdateDate <= a.UpdateDate
    ORDER BY b.UpdateDate DESC) AS statcode
, (SELECT TOP 1 NewValue
    FROM @t b
    WHERE b.FieldName = 'batch'
    AND b.PK = a.PK
    AND b.UpdateDate <= a.UpdateDate
    ORDER BY b.UpdateDate DESC) AS batch
, a.UpdateDate
FROM (
    SELECT PK
    , UpdateDate
    FROM @t
    GROUP BY PK, UpdateDate
) a
我想你应该按照PK和UpdateDate进行分组。所以我对每一列使用了一个子选择,如下所示:

DECLARE @t TABLE (
    PK NVARCHAR(255),
    FieldName NVARCHAR(255),
    OldValue NVARCHAR(255),
    NewValue NVARCHAR(255),
    UpdateDate DATETIME
)

INSERT INTO @t VALUES 
    ('<orderline=485040867>', 'qty', NULL, '1', '2016-04-28 03:24:57.490'),
    ('<orderline=485040867>', 'qtyrec', NULL, '0', '2016-04-28 03:24:57.490'),
    ('<orderline=485040867>', 'statcode', NULL, 'NP', '2016-04-28 03:24:57.490'),
    ('<orderline=485040867>', 'qtyrec', '0', '1', '2016-05-03 09:09:04.223'),
    ('<orderline=485040867>', 'statcode', 'RD', 'RC', '2016-05-03 09:09:04.223'),
    ('<orderline=485040867>', 'batch', NULL, 'MRP280416A', '2016-04-28 17:01:57.160'),
    ('<orderline=485040867>', 'statcode', 'NP', 'OR', '2016-04-28 17:01:57.160'),
    ('<orderline=485040867>', 'statcode', 'OR', 'RD', '2016-04-29 05:06:29.100');
SELECT a.PK
, (SELECT TOP 1 NewValue
    FROM @t b
    WHERE b.FieldName = 'qty'
    AND b.PK = a.PK
    AND b.UpdateDate <= a.UpdateDate
    ORDER BY b.UpdateDate DESC) AS qty
, (SELECT TOP 1 NewValue
    FROM @t b
    WHERE b.FieldName = 'qtyrec'
    AND b.PK = a.PK
    AND b.UpdateDate <= a.UpdateDate
    ORDER BY b.UpdateDate DESC) AS qtyrec
, (SELECT TOP 1 NewValue
    FROM @t b
    WHERE b.FieldName = 'statcode'
    AND b.PK = a.PK
    AND b.UpdateDate <= a.UpdateDate
    ORDER BY b.UpdateDate DESC) AS statcode
, (SELECT TOP 1 NewValue
    FROM @t b
    WHERE b.FieldName = 'batch'
    AND b.PK = a.PK
    AND b.UpdateDate <= a.UpdateDate
    ORDER BY b.UpdateDate DESC) AS batch
, a.UpdateDate
FROM (
    SELECT PK
    , UpdateDate
    FROM @t
    GROUP BY PK, UpdateDate
) a
这不是很快。您也可以使用外部应用,如以下示例所示

SELECT a.PK
, qty.NewValue AS qty
, qtyrec.NewValue AS qtyrec
, statcode.NewValue AS statcode
, batch.NewValue AS batch
, a.UpdateDate
FROM (
    SELECT PK
    , UpdateDate
    FROM @t
    GROUP BY PK, UpdateDate
) a
OUTER APPLY (
    SELECT TOP 1 OldValue, NewValue
    FROM @t b
    WHERE b.FieldName = 'qty'
    AND b.PK = a.PK
    AND b.UpdateDate <= a.UpdateDate
    ORDER BY b.UpdateDate DESC
) qty
OUTER APPLY (
    SELECT TOP 1 OldValue, NewValue
    FROM @t b
    WHERE b.FieldName = 'qtyrec'
    AND b.PK = a.PK
    AND b.UpdateDate <= a.UpdateDate
    ORDER BY b.UpdateDate DESC
) qtyrec
OUTER APPLY (
    SELECT TOP 1 OldValue, NewValue
    FROM @t b
    WHERE b.FieldName = 'statcode'
    AND b.PK = a.PK
    AND b.UpdateDate <= a.UpdateDate
    ORDER BY b.UpdateDate DESC
) statcode
OUTER APPLY (
    SELECT TOP 1 OldValue, NewValue
    FROM @t b
    WHERE b.FieldName = 'batch'
    AND b.PK = a.PK
    AND b.UpdateDate <= a.UpdateDate
    ORDER BY b.UpdateDate DESC
) batch

但是在运行时/io中似乎没有任何区别,只是查询计划不同。我无法提出一个好的pivot解决方案,但是您可以看看这个

我已经使用了您的示例输入,用于如下的变量表:

DECLARE @t TABLE (
    PK NVARCHAR(255),
    FieldName NVARCHAR(255),
    OldValue NVARCHAR(255),
    NewValue NVARCHAR(255),
    UpdateDate DATETIME
)

INSERT INTO @t VALUES 
    ('<orderline=485040867>', 'qty', NULL, '1', '2016-04-28 03:24:57.490'),
    ('<orderline=485040867>', 'qtyrec', NULL, '0', '2016-04-28 03:24:57.490'),
    ('<orderline=485040867>', 'statcode', NULL, 'NP', '2016-04-28 03:24:57.490'),
    ('<orderline=485040867>', 'qtyrec', '0', '1', '2016-05-03 09:09:04.223'),
    ('<orderline=485040867>', 'statcode', 'RD', 'RC', '2016-05-03 09:09:04.223'),
    ('<orderline=485040867>', 'batch', NULL, 'MRP280416A', '2016-04-28 17:01:57.160'),
    ('<orderline=485040867>', 'statcode', 'NP', 'OR', '2016-04-28 17:01:57.160'),
    ('<orderline=485040867>', 'statcode', 'OR', 'RD', '2016-04-29 05:06:29.100');
SELECT a.PK
, (SELECT TOP 1 NewValue
    FROM @t b
    WHERE b.FieldName = 'qty'
    AND b.PK = a.PK
    AND b.UpdateDate <= a.UpdateDate
    ORDER BY b.UpdateDate DESC) AS qty
, (SELECT TOP 1 NewValue
    FROM @t b
    WHERE b.FieldName = 'qtyrec'
    AND b.PK = a.PK
    AND b.UpdateDate <= a.UpdateDate
    ORDER BY b.UpdateDate DESC) AS qtyrec
, (SELECT TOP 1 NewValue
    FROM @t b
    WHERE b.FieldName = 'statcode'
    AND b.PK = a.PK
    AND b.UpdateDate <= a.UpdateDate
    ORDER BY b.UpdateDate DESC) AS statcode
, (SELECT TOP 1 NewValue
    FROM @t b
    WHERE b.FieldName = 'batch'
    AND b.PK = a.PK
    AND b.UpdateDate <= a.UpdateDate
    ORDER BY b.UpdateDate DESC) AS batch
, a.UpdateDate
FROM (
    SELECT PK
    , UpdateDate
    FROM @t
    GROUP BY PK, UpdateDate
) a
我想你应该按照PK和UpdateDate进行分组。所以我对每一列使用了一个子选择,如下所示:

DECLARE @t TABLE (
    PK NVARCHAR(255),
    FieldName NVARCHAR(255),
    OldValue NVARCHAR(255),
    NewValue NVARCHAR(255),
    UpdateDate DATETIME
)

INSERT INTO @t VALUES 
    ('<orderline=485040867>', 'qty', NULL, '1', '2016-04-28 03:24:57.490'),
    ('<orderline=485040867>', 'qtyrec', NULL, '0', '2016-04-28 03:24:57.490'),
    ('<orderline=485040867>', 'statcode', NULL, 'NP', '2016-04-28 03:24:57.490'),
    ('<orderline=485040867>', 'qtyrec', '0', '1', '2016-05-03 09:09:04.223'),
    ('<orderline=485040867>', 'statcode', 'RD', 'RC', '2016-05-03 09:09:04.223'),
    ('<orderline=485040867>', 'batch', NULL, 'MRP280416A', '2016-04-28 17:01:57.160'),
    ('<orderline=485040867>', 'statcode', 'NP', 'OR', '2016-04-28 17:01:57.160'),
    ('<orderline=485040867>', 'statcode', 'OR', 'RD', '2016-04-29 05:06:29.100');
SELECT a.PK
, (SELECT TOP 1 NewValue
    FROM @t b
    WHERE b.FieldName = 'qty'
    AND b.PK = a.PK
    AND b.UpdateDate <= a.UpdateDate
    ORDER BY b.UpdateDate DESC) AS qty
, (SELECT TOP 1 NewValue
    FROM @t b
    WHERE b.FieldName = 'qtyrec'
    AND b.PK = a.PK
    AND b.UpdateDate <= a.UpdateDate
    ORDER BY b.UpdateDate DESC) AS qtyrec
, (SELECT TOP 1 NewValue
    FROM @t b
    WHERE b.FieldName = 'statcode'
    AND b.PK = a.PK
    AND b.UpdateDate <= a.UpdateDate
    ORDER BY b.UpdateDate DESC) AS statcode
, (SELECT TOP 1 NewValue
    FROM @t b
    WHERE b.FieldName = 'batch'
    AND b.PK = a.PK
    AND b.UpdateDate <= a.UpdateDate
    ORDER BY b.UpdateDate DESC) AS batch
, a.UpdateDate
FROM (
    SELECT PK
    , UpdateDate
    FROM @t
    GROUP BY PK, UpdateDate
) a
这不是很快。您也可以使用外部应用,如以下示例所示

SELECT a.PK
, qty.NewValue AS qty
, qtyrec.NewValue AS qtyrec
, statcode.NewValue AS statcode
, batch.NewValue AS batch
, a.UpdateDate
FROM (
    SELECT PK
    , UpdateDate
    FROM @t
    GROUP BY PK, UpdateDate
) a
OUTER APPLY (
    SELECT TOP 1 OldValue, NewValue
    FROM @t b
    WHERE b.FieldName = 'qty'
    AND b.PK = a.PK
    AND b.UpdateDate <= a.UpdateDate
    ORDER BY b.UpdateDate DESC
) qty
OUTER APPLY (
    SELECT TOP 1 OldValue, NewValue
    FROM @t b
    WHERE b.FieldName = 'qtyrec'
    AND b.PK = a.PK
    AND b.UpdateDate <= a.UpdateDate
    ORDER BY b.UpdateDate DESC
) qtyrec
OUTER APPLY (
    SELECT TOP 1 OldValue, NewValue
    FROM @t b
    WHERE b.FieldName = 'statcode'
    AND b.PK = a.PK
    AND b.UpdateDate <= a.UpdateDate
    ORDER BY b.UpdateDate DESC
) statcode
OUTER APPLY (
    SELECT TOP 1 OldValue, NewValue
    FROM @t b
    WHERE b.FieldName = 'batch'
    AND b.PK = a.PK
    AND b.UpdateDate <= a.UpdateDate
    ORDER BY b.UpdateDate DESC
) batch

但是在运行时/io中似乎没有任何区别,只是查询计划不同。我想不出一个好的pivot解决方案,但你可以看看这个

你被困在哪里了?创建表单、连接到sqlserver、应用过滤器等等?对不起,我应该说得更清楚。创建表单是我的主要问题。我不确定如何组合这些行以显示我希望的方式,或者如何让FieldName记录如上图所示积极工作。我仍然不清楚这个问题。您需要SQL查询或表单方面的帮助吗?这就是你正在创建的表单类型吗?你被卡在哪里了?创建表单、连接到sqlserver、应用过滤器等等?对不起,我应该说得更清楚。创建表单是我的主要问题。我不确定如何组合这些行以显示我希望的方式,或者如何让FieldName记录如上图所示积极工作。我仍然不清楚这个问题。您需要SQL查询或表单方面的帮助吗?这就是您正在创建的表单类型吗?非常感谢!这正是我想要的。但是,我还需要能够加入到我们的Orderline表中。我需要加入orderline,它在该表中显示为,但在orderline表中显示为orderline列下的485040867。我曾尝试在orderline上使用LIKE语句进行连接,类似于从orderline ol内部连接审核a中选择*在类似ol.orderline的“%”+a.PK+“%”上进行连接,但这并没有起作用。最简单的方法是删除不需要的字符,因为这些字符似乎是静态的:选择CASTREPLACEREPLACEPK,,与orderline一样int再次感谢您!这为我提供了我所需要的一切!是时候开始构建此表单了。。。这个问题现在可以结束了。非常感谢!这正是我想要的。但是,我还需要能够加入到我们的Orderline表中。我需要加入orderline,它在该表中显示为,但在orderline表中显示为orderline列下的485040867。我曾尝试在orderline上使用LIKE语句进行连接,类似于从orderline ol内部连接审核a中选择*在类似ol.orderline的“%”+a.PK+“%”上进行连接,但这并没有起作用。最简单的方法是删除不需要的字符,因为这些字符似乎是静态的:选择CASTREPLACEREPLACEPK,,与orderline一样int再次感谢您!这为我提供了我所需要的一切!是时候开始构建此表单了。。。这个问题现在可以结束了。