Bonjour,

Je vais devenir chèvre avec mes bovins !

Structure simplifiée de la table 'detentions' :
- B_D_FK_IND_BOVINS : l'identifiant du bovin
- B_D_DAT_ENTR : la date d'entrée dans une exploitation, de type DATE
- B_D_DAT_SORT : la date de sortie de l'exploitation, de type DATE
- B_D_FK_IND_CAUSE_SORT : identifiant de la cause de sortie de détention

1) Nombre de détentions à cause de sortie 2, 3 ou 11 qui ont une détention ultérieure :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
SELECT COUNT(*)
FROM bdni2.detentions d1
WHERE d1.B_D_FK_IND_CAUSE_SORT IN (2, 3, 11)
    AND EXISTS (
        SELECT *
        FROM bdni2.detentions d2
        WHERE d1.B_D_FK_IND_BOVINS = d2.B_D_FK_IND_BOVINS
            AND d2.B_D_DAT_ENTR >= d1.B_D_DAT_SORT
            AND d2.B_D_DAT_ENTR > d1.B_D_DAT_ENTR
    )
# Résultat : 207 547
2) Nombre de détentions (d1) à cause de sortie 2, 3 ou 11 qui ont une détention ultérieure (d2) dont la date d'entrée de d2 est égale à la date de sortie de d1 :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
SELECT COUNT(*)
FROM bdni2.detentions d1
WHERE d1.B_D_FK_IND_CAUSE_SORT IN (2, 3, 11)
    AND EXISTS (
        SELECT *
        FROM bdni2.detentions d2
        WHERE d1.B_D_FK_IND_BOVINS = d2.B_D_FK_IND_BOVINS
            AND d2.B_D_DAT_ENTR = d1.B_D_DAT_SORT
            AND d2.B_D_DAT_ENTR > d1.B_D_DAT_ENTR
        )
# Résultat : 50 326 détentions
3) Nombre de détentions (d1) à cause de sortie 2, 3 ou 11 qui ont une détention ultérieure (d2) dont la date d'entrée de d2 est de 1 à 2 jours après la date de sortie de d1 :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
SELECT COUNT(*)
FROM bdni2.detentions d1
WHERE d1.B_D_FK_IND_CAUSE_SORT IN (2, 3, 11)
    AND EXISTS(
        SELECT *
        FROM bdni2.detentions d2
        WHERE d1.B_D_FK_IND_BOVINS = d2.B_D_FK_IND_BOVINS
        AND d2.B_D_DAT_ENTR > d1.B_D_DAT_SORT
        AND DATE_ADD(d1.B_D_DAT_SORT, INTERVAL 2 DAY) >= d2.B_D_DAT_ENTR
        AND d2.B_D_DAT_ENTR = (
            SELECT MIN(d3.B_D_DAT_ENTR)
            FROM bdni2.detentions d3
            WHERE d3.B_D_FK_IND_BOVINS = d1.B_D_FK_IND_BOVINS
                AND d3.B_D_DAT_ENTR > d1.B_D_DAT_SORT
                AND d3.B_D_DAT_ENTR > d1.B_D_DAT_ENTR
        )
    )
# Résultat : 103 086
4) Nombre de détentions (d1) à cause de sortie 2, 3 ou 11 qui ont une détention ultérieure (d2) dont la date d'entrée de d2 est de 3 à 7 jours après la date de sortie de d1 :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
SELECT COUNT(*)
FROM bdni2.detentions d1
WHERE d1.B_D_FK_IND_CAUSE_SORT IN (2, 3, 11)
    AND EXISTS(
        SELECT *
        FROM bdni2.detentions d2
        WHERE d1.B_D_FK_IND_BOVINS = d2.B_D_FK_IND_BOVINS
        AND d1.B_D_DAT_SORT < d2.B_D_DAT_ENTR
        AND DATE_ADD(d1.B_D_DAT_SORT, INTERVAL 2 DAY) < d2.B_D_DAT_ENTR
        AND DATE_ADD(d1.B_D_DAT_SORT, INTERVAL 7 DAY) >= d2.B_D_DAT_ENTR
        AND d2.B_D_DAT_ENTR = (
            SELECT MIN(d3.B_D_DAT_ENTR)
            FROM bdni2.detentions d3
            WHERE d3.B_D_FK_IND_BOVINS = d1.B_D_FK_IND_BOVINS
                AND d3.B_D_DAT_ENTR > d1.B_D_DAT_SORT
            )
        )
# Résultat : 33 652
5) Nombre de détentions (d1) à cause de sortie 2, 3 ou 11 qui ont une détention ultérieure (d2) dont la date d'entrée de d2 est plus de 7 jours après la date de sortie de d1 :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
SELECT COUNT(*)
FROM bdni2.detentions d1
WHERE d1.B_D_FK_IND_CAUSE_SORT IN (2, 3, 11)
    AND EXISTS(
        SELECT *
        FROM bdni2.detentions d2
        WHERE d1.B_D_FK_IND_BOVINS = d2.B_D_FK_IND_BOVINS
            AND d1.B_D_DAT_SORT < d2.B_D_DAT_ENTR
            AND DATE_ADD(d1.B_D_DAT_SORT, INTERVAL 7 DAY) < d2.B_D_DAT_ENTR
            AND d2.B_D_DAT_ENTR = (
                SELECT MIN(d3.B_D_DAT_ENTR)
                FROM bdni2.detentions d3
                WHERE d3.B_D_FK_IND_BOVINS = d1.B_D_FK_IND_BOVINS
                    AND d3.B_D_DAT_ENTR > d1.B_D_DAT_SORT
            )
        )
# Résultat : 23 496
Quand j'additionne les résultats 2 à 5 (210 560), je trouve plus que 1 !

Qu'est-ce qui cloche ?