我的困境是這樣的:SQL:合併類似的行而比較版本
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
你在使用什麼SQL風格? – scsimon
用您正在使用的數據庫標記您的問題。 –
您好我試圖與SQL Server 12.0.5203.0 – Jsaville