SQL:比较版本时合并相似的行

时间:2017-08-17 13:18:32

标签: sql solidworks sqltransaction

我的困境看起来像这样:

     FileName    Version    Type    Doc_Number    Owner    Request    Date
1.   ECN 0001       3        ECN      NULL        NULL      NULL      NULL
2.   ECN 0001       1        NULL     NULL        NULL      NULL      2017-08-14
3.   ECN 0001       2        NULL     NULL        NULL      NULL      08/14/17
4.   ECN 0001       2        NULL     NULL        NULL      NULL      NULL
5.   ECN 0001       2        NULL     NULL        JOHN      NULL      NULL
6.   ECN 0001       1        NULL     Form        NULL      NULL      NULL
7.   ECN 0001       2        NULL     0001        NULL      NULL      NULL
8.   ECN 0002 ect...
N.   ECN 9999 ect...

文件列表很长,所以解决方案应该考虑更改文件名,我希望将重复的文件名压缩成一行。有时,数据在同一文件的行或列中将包含多个值。

规则是每个版本最多只能有一个列值,如上所示,例如ECN 0001版本1只列出了一个日期,但版本2可以列出另一个日期。版本3将是最新版本,但是从v2到v3的唯一更改是类型。

我希望新列表看起来像这样:

     FileName    LatestVersion    Type    Doc_Number    Owner    Request    Date
1.   ECN 0001          3          ECN       0001        JOHN      NULL      08/14/17
2.   ECN 0002          6          PGT       0002        BOB       JAKE      08/14/17
3.   ECN 0003          2          ECN       0003        KYLE      BOB       08/14/17
4.   ECN 0004          4          ECN       0001        TOM       BILL      08/14/17
5.   ECN 0005          8          ECN       0001        KATE      KELVIN    08/14/17
6.   ECN 0006          2          ECN       0001        STEVE     JOHN      08/14/17
7.   ECN 0007          5          ECN       0001        JOHN      STEVE     08/14/17
n.   ECN 9999          99         EXR       9999        CHERYL    CARL      09/14/26

主要思想是新列表被压缩为每个文件一行,其中包含来自最新版本的所有信息,可能是某些值自版本1或2以来未更改,因此仍应出现在最新版本表中。如果每个文件存在多个值,则应使用最新值。在ECN 0001请求的情况下,也可能没有任何版本存在信息。

我想过使用max,但最新值并不总是最大值,因此在修剪旧数据时,确实需要考虑数据的版本号。

这是我当前的代码,如果它有帮助:

select FileName, Version,
(case when VariableName = 'Document Type' then  ValueText end) as Type,
(case when VariableName = 'Document Number' then  ValueText end) as Doc_Number,
(case when VariableName = 'Owner' then  ValueText end) as Owner,
(case when VariableName = 'Requested By' then  ValueText end) as Request,
(case when VariableName = 'Date Written' then  ValueText end) as Date
FROM
(
SELECT Documents.Filename,VariableValue.ValueText,VariableValue.Version,Variable.VariableName
FROM Documents INNER JOIN VariableValue ON Documents.DocumentID = VariableValue.DocumentID INNER JOIN Variable ON VariableValue.VariableID = Variable.VariableID
WHERE Filename LIKE 'ECN_____.pdf' AND Filename <> 'ECN Form.PDF'
) t
Order by Filename

1 个答案:

答案 0 :(得分:0)

我看到纯sql解决方案的唯一选择是user defined aggregate function。这是他们提供的sample

这确实涉及用clr兼容语言编写代码并将结果dll复制到sql server文件夹,但从连接到sql server的应用程序的角度来看,它看起来就像是纯sql解决方案。