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