Mon objectif est de lister le nom et le nombre d'enfants de chaque membre d'une famille utilisant MS SQL:
Exemple d'arbre généalogique dans l'image (basé sur l'ID)
! [entrez la description de l'image ici] [1]
Les tableaux que j'ai sont:
Famille
+----------------+--------------------+ | f_name | number of children | +----------------+--------------------+ | Name Surname 1 | 2 | +----------------+--------------------+ | Name Surname 2 | 2 | +----------------+--------------------+ | Name Surname 3 | 3 | +----------------+--------------------+ | Name Surname 7 | 1 | +----------------+--------------------+ | Name Surname 8 | 1 | +----------------+--------------------+
Rapports
+----------+---------+ | r_parent | r_child | +----------+---------+ | 1 | 2 | +----------+---------+ | 1 | 3 | +----------+---------+ | 2 | 4 | +----------+---------+ | 2 | 5 | +----------+---------+ | 3 | 6 | +----------+---------+ | 3 | 7 | +----------+---------+ | 3 | 8 | +----------+---------+ | 7 | 9 | +----------+---------+ | 8 | 10 | +----------+---------+
Les résultats nécessaires sont MIS À JOUR
+------+-----------------+ | f_id | f_name | +------+-----------------+ | 1 | Name Surname 1 | +------+-----------------+ | 2 | Name Surname 2 | +------+-----------------+ | 3 | Name Surname 3 | +------+-----------------+ | 4 | Name Surname 4 | +------+-----------------+ | 5 | Name Surname 5 | +------+-----------------+ | 6 | Name Surname 6 | +------+-----------------+ | 7 | Name Surname 7 | +------+-----------------+ | 8 | Name Surname 8 | +------+-----------------+ | 9 | Name Surname 9 | +------+-----------------+ | 10 | Name Surname 10 | +------+-----------------+
Merci pour l'aide [1]: https://i.stack.imgur.com/SwJB9.png
3 Réponses :
Cela ressemble à une join
et une agrégation de base:
with cte as ( select r.parent, r.r_id from relations r union all select cte.parent, r.r_id from cte join relations r on r.parent = cte.r_id ) select parent, count(*) as num_children from cte group by parent;
Je pensais que vous vouliez compter les enfants à travers les générations. Cela nécessite un CTE récursif:
select f.f_name, count(*) from family f join relations r on f.f_id = r.parent group by f.f_name, f.f_id;
SELECT family.f_id ,rel.[number of children] FROM family JOIN ( SELECT r_parent ,count(*) AS [number of children] FROM relations GROUP BY r_parent ) rel ON rel.r_parent = family.f_id
Et un autre évitant le compte (*)
SELECT * FROM ( SELECT F.f_name, (SELECT Count(1) FROM Relations R WHERE R.r_parent = F.f_id) [number of children] FROM Family F ) Fathers WHERE Fathers.[number of children] > 0
en plus un avec l'utilisation de la sous-requête
SELECT F.f_name, COUNT(1) [number of children] FROM Family F JOIN Relations R ON R.r_parent = F.f_id GROUP BY F.f_name
Et comment les résultats sont-ils calculés? Ce n'est pas évident pour les noms de famille 3, 7 et 8.
Le tableau des relations montre que les parents ont des enfants et l'image de l'arbre généalogique montre que chaque père a combien d'enfants
Comment le nombre est-il calculé? Vos résultats ne correspondent pas aux données que vous avez fournies.
Les résultats nécessaires sont corrigés, il était basé sur un exemple avec moi, désolé. c'est maintenant correct
la question est mise à jour