我的困境看起来像这样:
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
答案 0 :(得分:0)
我看到纯sql解决方案的唯一选择是user defined aggregate function。这是他们提供的sample。
这确实涉及用clr兼容语言编写代码并将结果dll复制到sql server文件夹,但从连接到sql server的应用程序的角度来看,它看起来就像是纯sql解决方案。