2017-08-17 5 views
1

mon dilemme ressemble à ceci:SQL: Fusion des lignes similaires en comparant les versions

 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... 

La liste des fichiers est longue de sorte que la solution doit prendre en noms de fichiers de changement de compte, je souhaite condenser les noms de fichiers en double en une seule ligne. Parfois, les données auront plus d'une valeur dans une ligne ou une colonne pour le même fichier. Une règle est qu'il ne peut y avoir qu'une seule valeur de colonne par version comme indiqué ci-dessus, par exemple ECN 0001 version 1 n'a qu'une seule date répertoriée, mais la version 2 peut avoir une autre date répertoriée. La version 3 serait la dernière version mais la seule modification apportée de v2 à v3 était le type.

Je veux la nouvelle liste pour ressembler à ceci:

 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 

L'idée principale est que la nouvelle liste est condensé à une ligne par fichier avec toutes les infos de la dernière version, il se peut que certaines valeurs sont inchangés depuis la version 1 ou 2 et devraient donc apparaître toujours dans la dernière version du tableau. Si plus d'une valeur est présente par fichier, la dernière doit être utilisée. Il est également possible qu'aucune des versions n'ait les informations présentes comme dans le cas de ECN 0001 Request.

Je pensais utiliser max, mais la valeur la plus récente n'est pas toujours la plus grande valeur, donc la décision doit vraiment prendre en compte le numéro de version des données lors du découpage de données plus anciennes.

Ceci est mon code actuel si elle aide:

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

Quelle est la saveur de SQL avec laquelle vous travaillez? – scsimon

+1

Marquez votre question avec la base de données que vous utilisez. –

+0

Salut j'ai essayé de le marquer avec SQL Server 12.0.5203.0 – Jsaville

Répondre

0

La seule option que je vois pour la solution pure sql est user defined aggregate function. Voici un sample qu'ils fournissent. Cela implique d'écrire du code dans un langage compatible clr et de copier le résultat dll dans le dossier sql server, mais du point de vue de l'application se connectant au serveur sql, il ressemblera à une solution SQL pure.

+0

Cela semble assez puissant, merci de m'indiquer dans cette direction, mal voir ce que je peux apprendre à ce sujet et de rendre compte. – Jsaville