2017-08-23 3 views
0

Les données actuelles de la table Emp:requête SQL pour obtenir tous les parents et enfants pour chaque enregistrements dans SQL Server 2014

EmpId Name   RejEmpId DOJ    DOL   
---------------------------------------------------------- 
1  Name1   NULL 10-12-2014  12-06-2015 
2  Name1   1  06-04-2016  24-12-2016  
3  Name1   2  01-04-2017  NULL   
4  Name2   NULL 22-12-2014  21-07-2015 
5  Name2   4  10-04-2016  22-12-2016  
6  Name3   NULL 10-05-2015  NULL    
7  Name4   NULL 10-05-2015  NULL  

Je veux obtenir des colonnes personnalisées (Tous les parents et enfants EMPID, ministère de la Justice actuelle, DOL réelle)

EmpId Name RejEmpId DOJ  DOL   All    
              Parent    
              And 
              Child Actual  Actual 
              EmpId DOJ   DOL   
1 Name1 NULL 10-12-2014 12-06-2015 1.2.3 10-12-2014 NULL 
2 Name1 1  06-04-2016 24-12-2016 1.2.3 10-12-2014 NULL 
3 Name1 2  01-04-2017 NULL  1.2.3 10-12-2014 NULL 
4 Name2 NULL 22-12-2014 21-07-2015 4.5  22-12-2014 22-12-2016 
5 Name2 4  10-04-2016 22-12-2016 4.5  22-12-2014 22-12-2016 
6 Name3 NULL 10-05-2015 NULL  6  10-05-2015 NULL 
7 Name4 NULL 10-05-2015 NULL  7  10-05-2015 NULL 
8 Name5 NULL 12-06-2015 20-12-2016 8  12-06-2015 20-12-2016 
+1

Quelle est la question? "Ecrire la requête pour moi" n'est pas une question. Il y a un * LOT * de questions en double qui montrent comment écrire des requêtes hiérarchiques avec des CTE 'hierarchyid' ou récursifs. Avez-vous essayé quelque chose? Avez-vous rencontré des problèmes? –

+0

j'ai utilisé https://www.codeproject.com/Articles/818694/SQL-queries-to-manage-hierarchical-or-parent-child –

+0

j'ai utilisé https://www.codeproject.com/Articles/818694/SQL-query-to-manage-hierarchical-or-parent-child Tous les parents possibles dans une section de colonne. je ne pouvais pas réussir à faire DOJ réel et réel DOL. Le DOJ réel est le premier parent DOJ et le dernier enfant DOL réel DOL –

Répondre

0

Si je comprends bien, vous pouvez interroger correctement comme ci-dessous:

Pour concaténation, vous pouvez utiliser Stuff, Obtenir première valeur de DOJ vous pouvez utiliser la fonction FIRST_VALUE qui est dans SQL Server 2012+ et de même pour DOL, vous pouvez utiliser la fonction LAST_VALUE comme ci-dessous:

Select emp.EmpId, Emp.[Name], RejEmpId, emp.DOJ, DOL, concatStr as [AllParent and Child EmpId] 
    ,FIRST_VALUE(DOJ) over(partition by emp.[Name] order by EmpId) as ActualDOJ 
    ,LAST_VALUE(DOL) over(partition by emp.[Name] order by EmpId rows between current row and unbounded following) as AcualDOL 
    from #empdata emp 
cross apply (
    Select [Name], concatStr = stuff((select concat('.', EmpId) from #empdata e where e.[Name] = o.[Name] for xml path('')),1,1,'') 
    from #empdata o 
    group by [Name] 
) c where emp.[Name] = c.[Name] 

sortie comme ci-dessous:

+-------+-------+----------+------------+------------+---------------------------+------------+------------+ 
| EmpId | Name | RejEmpId | DOJ  | DOL  | AllParent and Child EmpId | ActualDOJ | AcualDOL | 
+-------+-------+----------+------------+------------+---------------------------+------------+------------+ 
|  1 | Name1 | NULL  | 2014-12-10 | 2015-06-12 |      1.2.3 | 2014-12-10 | NULL  | 
|  2 | Name1 | 1  | 2016-04-06 | 2016-12-24 |      1.2.3 | 2014-12-10 | NULL  | 
|  3 | Name1 | 2  | 2017-04-01 | NULL  |      1.2.3 | 2014-12-10 | NULL  | 
|  4 | Name2 | NULL  | 2014-12-22 | 2015-07-21 |      4.5 | 2014-12-22 | 2016-12-22 | 
|  5 | Name2 | 4  | 2016-04-10 | 2016-12-22 |      4.5 | 2014-12-22 | 2016-12-22 | 
|  6 | Name3 | NULL  | 2015-05-10 | NULL  |       6 | 2015-05-10 | NULL  | 
|  7 | Name4 | NULL  | 2015-05-10 | NULL  |       7 | 2015-05-10 | NULL  | 
+-------+-------+----------+------------+------------+---------------------------+------------+------------+ 
+0

même nom mais il est employé différent signifie, ce qui s'est passé –

+0

Pour cela, vous devez fournir une colonne qui a l'attribut d'identifiant employé correct –

+0

veut maintenir l'unicité pour le même employé. est-ce correct. –