Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2010 tableau de comptage sans doublon

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

cathodique

XLDnaute Barbatruc
Bonjour,

N'étant pas parvenu à résoudre mon problème seul. Je sollicite une aide auprès de la communauté d'XLD.

Sur la feuille résultat vous trouverez 3 petits tableaux, le nombre de lignes est fonction du nombre d’espèces (col6).
Je les ai arrêté à 3 par rapport aux données actuelles de la bd, juste pour illustrer le problème.
Je voudrais travailler avec des variables tableaux parce que la bd aura un nombre très important de lignes. (les colonnes pourraient évoluer aussi).

L'objectif est de compter sans doublon selon des critères:
Critère1 sur les dates, 1er tableau jusqu'à fin de l'année N-1, 2ème tableau année en cours et le 2ème toutes les années.
Critère2 par rapport aux espèces, dans les tableaux résultats ils sont dans la colonne1 à partir de la 2ème ligne et se trouvent en colonne 6 de la bd. Ils faut compte pour chaque espèce selon les critères 3, qui se trouvent en ligne 1 à partir de la 2ème colonne des petits tableaux. les critères de 2 à 7 se trouvent dans la colonne 4 de la bd; de 8 à 9 dans la colonne 13 et la 10 dans la colonne 14.

Pour 8 à 9, le comptage se fait si dans la colonne 4 il y a "Fa"
Pour 10, le comptage se fait si l'année de la colonne 14 correspond à l'année de la colonne 1.

Dans une précédente discussion, @dysorthographie m'avait suggéré une approche dans le genre bataille navale pour récupérer les critères. Très bonne idée, mais je me suis emmêlé les pinceaux.

Je suis parvenu à mon monter mes petits tableaux par code (non joint pour le pas "polluer" le fichier☺️).
Et, il se peut que mon approche était fausse dès le départ.

En espérant, avoir été clair.

Merci
 
Dernière édition:
Merci beaucoup.
Je m'excuse si je n'ai pas été à la hauteur pour exposer mon problème.
et désolé d'avoir peut-être causé des frustrations à certain.
 
a oui désolé j'ai inversé les colonne dan ma requête mais si tu remets en phase les entête de colonnes ?

EspèceCdFaAdChFaRtAdAdoptableNon AdoptableA DéterminerDécès
2010​
Chat​
0​
1​
0​
0​
0​
0​
0​
0​
0​
2011
Chien
1
0​
0​
0​
0​
0​
0​
0​
1
2015​
Chat​
0​
1​
1​
0​
0​
0​
0​
0​
0​
2016​
Chat​
0​
2​
0​
0​
0​
0​
0​
0​
0​
2017
Chat
0​
2
1
0​
0​
0​
0​
0​
1
2018​
Chien​
0​
1​
0​
0​
0​
0​
0​
0​
0​
2019​
Chat​
0​
6​
0​
2​
0​
0​
0​
0​
0​
2020​
Chat
0​
5
0​
0​
0​
0​
0​
0​
1
2021​
Chat​
2​
10​
0​
2​
0​
0​
0​
0​
0​
2021​
Chien​
0​
1​
0​
0​
0​
0​
0​
0​
0​
2022​
Chat​
0​
8​
0​
0​
0​
0​
0​
0​
0​
2023​
Chat​
11​
24​
0​
3​
0​
0​
0​
0​
0​
2023​
Chien​
0​
4​
0​
0​
0​
0​
0​
0​
0​
2023​
Lapin​
0​
1​
0​
0​
0​
0​
0​
0​
0​
2024​
Chat​
0​
28​
34​
0​
0​
0​
0​
2​
0​
2024​
Chien​
0​
2​
4​
0​
0​
0​
0​
0​
0​
2024​
Lapin​
0​
0​
1​
0​
0​
0​
0​
0​
0​
 
Je te remercie mais ce n'est pas du tout ça. Ci-dessous résultat

2 chats décès et 1 chien doivent apparaitre pour 2024, car les décès sont survenus en 2024.
En espérant que tu me comprennes. Encore merci.

Bonne soirée.
 
Ok merci pour la précision ça me tardait de voir 2024 pour la date de décès sur l'année 2019 d'où le surlignage des résultats.

EspèceCdFaAdChFaRtAdAdoptableNon AdoptableA DéterminerDécès
2010​
Chat​
0​
1​
0​
0​
0​
0​
0​
0​
0​
2011​
Chien​
1​
0​
0​
0​
0​
0​
0​
0​
0​
2015​
Chat​
0​
1​
1​
0​
0​
0​
0​
0​
0​
2016​
Chat​
0​
2​
0​
0​
0​
0​
0​
0​
0​
2017​
Chat​
0​
2​
1​
0​
0​
0​
0​
0​
0​
2018​
Chien​
0​
1​
0​
0​
0​
0​
0​
0​
0​
2019​
Chat​
0​
6​
0​
2​
0​
0​
0​
0​
0​
2020​
Chat​
0​
5​
0​
0​
0​
0​
0​
0​
0​
2021​
Chat​
2​
10​
0​
2​
0​
0​
0​
0​
0​
2021​
Chien​
0​
1​
0​
0​
0​
0​
0​
0​
0​
2022​
Chat​
0​
8​
0​
0​
0​
0​
0​
0​
0​
2023​
Chat​
11​
24​
0​
3​
0​
0​
0​
0​
0​
2023​
Chien​
0​
4​
0​
0​
0​
0​
0​
0​
0​
2023​
Lapin​
0​
1​
0​
0​
0​
0​
0​
0​
0​
2024​
Chat​
0​
28​
34​
0​
0​
0​
0​
2​
2​
2024​
Chien​
0​
2​
4​
0​
0​
0​
0​
0​
1​
2024​
Lapin​
0​
0​
1​
0​
0​
0​
0​
0​
0​
 
Ok, merci, mais les autres résultats ne sont pas corrects à l'exception de quelques uns.
Je suppose que je n'ai pas été très clair. Je ne sais pas si tu soustrais ou ne compte dans la catégorie Cd.
On compte cette catégorie et on n'y touche plus. La gestion des mouvements se fait au travers des autres catégories (Fa, Ad, ChFa et RtAd).
 
reposte le tableaux corrigé avec tes commentaire et je devrai trouvé les bonnes correction

On compte les cd tél qu'il ce présente car il ne peuvent pas être en double ?

Pour les autres qui correspondent à des mouvements on prend le dernier mouvement?

pourrais tu également préciser sur quel critère Etat des Animaux encore présents en Fin d'Année 2024.

ne te flagelle pas, ton propos est complexe et à expliquer et à comprendre mais je pense qu'on est en bon voie!

De toutes le façon je me vengerai au moment des explications car un usine à gaz en SQL ce ce digérer pas facilement.

VB:
Sub test2()
Dim SqlTOutSdoublon As String, SqlTOutTOut As String, Sql
 SqlTOutSdoublon = "(SELECT  year([Date]) as Annee,NoDossier,last([Cat#]) as Cat,last(Espece) as Espece,last(Caractère) as Caractère,max(DateDC) as DateDC FROM [BD$] group by NoDossier, year([Date]))"

With CreateObject("Adodb.connection")
    .Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties=""Excel 12.0;HDR=YES;"""
    SqlTOut = "SELECT Annee, Espece, sum(CD) as CD,sum(FA) as FA,sum(AD) as AD,sum(ChFa) as ChFa,Sum(RtAd) as RtAd,Sum(adoptable) as adoptable,Sum(NAdoptable) as NAdoptable,sum([A Déterminer]) as [A Déterminer],Sum(DateDc) as DateDc FROM (" & vbCrLf
    SqlTOut = SqlTOut & "SELECT DISTINCT NoDossier, Annee, [Espece], 1 AS CD, 0 AS FA,0 as AD,0 as ChFa,0 as RtAd,0 as adoptable,0 as NAdoptable,0 AS [A Déterminer],0 as DateDc FROM " & SqlTOutSdoublon & " WHERE UCASE([Cat]) = 'CD'" & vbCrLf
    SqlTOut = SqlTOut & "UNION ALL" & vbCrLf
    SqlTOut = SqlTOut & "SELECT DISTINCT NoDossier, Annee, [Espece], 0 AS CD, 1 AS FA ,0 as AD,0 as ChFa,0 as RtAd,0 as adoptable,0 as NAdoptable,0 AS [A Déterminer],0 as DateDc FROM " & SqlTOutSdoublon & " WHERE UCASE([Cat]) = 'FA'" & vbCrLf
    SqlTOut = SqlTOut & "UNION ALL" & vbCrLf
    SqlTOut = SqlTOut & "SELECT DISTINCT NoDossier, Annee, [Espece], 0 AS CD, 0 AS FA,1 as AD,0 as ChFa,0 as RtAd,0 as adoptable,0 as NAdoptable,0 AS [A Déterminer],0 as DateDc FROM " & SqlTOutSdoublon & " WHERE UCASE([Cat]) = 'AD'" & vbCrLf
    SqlTOut = SqlTOut & "UNION ALL" & vbCrLf
    SqlTOut = SqlTOut & "SELECT DISTINCT NoDossier, Annee, [Espece], 0 AS CD, 0 AS FA,0 as AD,1 as ChFa,0 as RtAd,0 as adoptable,0 as NAdoptable,0 AS [A Déterminer],0 as DateDc FROM " & SqlTOutSdoublon & " WHERE UCASE([Cat]) = 'CHFA'" & vbCrLf
    SqlTOut = SqlTOut & "UNION ALL" & vbCrLf
    SqlTOut = SqlTOut & "SELECT DISTINCT NoDossier, Annee, [Espece], 0 AS CD, 0 AS FA,0 as AD,0 as ChFa,1 as RtAd ,0 as adoptable,0 as NAdoptable,0 AS [A Déterminer],0 as DateDc FROM " & SqlTOutSdoublon & " WHERE UCASE([Cat]) = 'RTAD'" & vbCrLf
    SqlTOut = SqlTOut & "UNION ALL" & vbCrLf
     SqlTOut = SqlTOut & "SELECT DISTINCT NoDossier, Annee, [Espece], 0 AS CD, 0 AS FA,0 as AD,0 as ChFa,0 as RtAd ,1 as adoptable,0 as NAdoptable,0 AS [A Déterminer],0 as DateDc FROM " & SqlTOutSdoublon & " WHERE UCASE([Cat]) = 'ADOPTABLE'" & vbCrLf
     SqlTOut = SqlTOut & "UNION ALL" & vbCrLf
     SqlTOut = SqlTOut & "SELECT DISTINCT NoDossier, Annee, [Espece], 0 AS CD, 0 AS FA,0 as AD,0 as ChFa,0 as RtAd ,0 as adoptable,1 as NAdoptable,0 AS [A Déterminer],0 as DateDc FROM " & SqlTOutSdoublon & " WHERE UCASE([Cat]) = 'NON ADOPTABLE'" & vbCrLf
     SqlTOut = SqlTOut & "UNION ALL" & vbCrLf
     SqlTOut = SqlTOut & "SELECT DISTINCT NoDossier,year(DateDc) as  Annee, [Espece], 0 AS CD, 0 AS FA,0 as AD,0 as ChFa,0 as RtAd ,0 as adoptable,0 as NAdoptable,0 AS [A Déterminer],1 as DateDc FROM " & SqlTOutSdoublon & " WHERE[DateDc]  is not null" & vbCrLf
     SqlTOut = SqlTOut & "UNION ALL" & vbCrLf
     SqlTOut = SqlTOut & "SELECT DISTINCT NoDossier, Annee, [Espece], 0 AS CD, 0 AS FA,0 as AD,0 as ChFa,0 as RtAd ,0 as adoptable,0 as NAdoptable,1 AS [A Déterminer],0 as DateDc FROM " & SqlTOutSdoublon & " WHERE UCASE([Caractère]) = ucase('A Déterminer')" & vbCrLf
      SqlTOut = SqlTOut & "UNION ALL" & vbCrLf
     SqlTOut = SqlTOut & "SELECT DISTINCT  NoDossier, Year([BD$].[Date]) AS Annee, Especes.Espece,CD,FA,AD,ChFa,RtAd,adoptable,NAdoptable,[A Déterminer],DateDc   FROM [BD$] , (SELECT DISTINCT Espece, 0 AS CD, 0 AS FA, 0 AS AD, 0 AS ChFa, 0 AS RtAd, 0 AS adoptable, 0 AS NAdoptable, 0 AS [A Déterminer], 0 AS DateDc FROM [BD$]) AS Especes" & vbCrLf
     SqlTOut = SqlTOut & ") AS SubQuery GROUP BY Annee, Espece"

'2023
 Sql = "SELECT  Espece, sum(CD) as CD,sum(FA) as FA,sum(AD) as AD,sum(ChFa) as ChFa,Sum(RtAd) as RtAd,Sum(adoptable) as adoptable,Sum(NAdoptable) as NAdoptable,sum([A Déterminer]) as [A Déterminer],Sum(DateDc) as DateDc FROM (" & vbCrLf
 Sql = Sql & SqlTOut
 Sql = Sql & ") AS SubQuery WHERE Annee=" & Year(Date) - 1 & "  GROUP BY  Espece"
   Sheets("Résultat").Range("B7").CopyFromRecordset .Execute(Sql)
 
'2024
 Sql = "SELECT  Espece, sum(CD) as CD,sum(FA) as FA,sum(AD) as AD,sum(ChFa) as ChFa,Sum(RtAd) as RtAd,Sum(adoptable) as adoptable,Sum(NAdoptable) as NAdoptable,sum([A Déterminer]) as [A Déterminer],Sum(DateDc) as DateDc FROM (" & vbCrLf
 Sql = Sql & SqlTOut
 Sql = Sql & ") AS SubQuery WHERE Annee=" & Year(Date) & "  GROUP BY  Espece"
   Sheets("Résultat").Range("B13").CopyFromRecordset .Execute(Sql)
End With

End Sub
 
Dernière édition:
Bonjour,

Merci beaucoup. SqlTout n'est défini, en quoi dois-je la définir?

De mon côté, je penses être sur la bonne voie.

Je t'explique comment j'ai procédé pour une espèce manuellement, par exemple chat.

Je filtre la colonne date,

ensuite filtre colonne espèce (chat),

ensuite filtre colonne Cat: 1. Cd et compte dans la colonne NoDossier (normalement,pour cette cat. il n'y a pas de doublon. Sauf erreur, alors par précaution compter sans doublon)
2. puis Fa et on compte NoDossier
3. puis Ad et on compte NoDossier
4. puis ChFa et on compte NoDossier
5. puis RtAd et on compte NoDossier (on ne compte pas RtFa, car pour RtAd il y a une RtFa)

Je défiltre la colonne Cat et passe à la colonne caractère
1. filtre sur 'adoptable' et filtre en colonne Cat sur 'Fa' et compte NoDossier sans doublon
2. même topo pour 'non adoptable' et 'à déterminer'

Pourla colonne DateDc, ils sont à compter si la date correspond ou est dans l'intervalle des dates du tableau considéré.

Particularité pour les décès, lorsque l'on compte Les Fa ils ne doivent être pris en compte.

C'est la même chose pour les caractères. Autrement dit, si l'animal décédé avait un caractère 'adoptable' on ne le compte pas dans les 'adoptables'. on ne le compte pas suivant son caractère.

Je ne sais si c'est assez clair.

Encore merci. Bonne journée.


edit: Grossière erreur de ma part, tous les résultats de la colonne Fa sont erronés. En effet, ils ne faut pas compter lorsqu'il y a une Ad. Pour avoir les bons chiffres, il faut diminuer le nombre des Ad de la colonne Fa. Toutes mes excuses.
 
Dernière édition:
Re cathodique, 🙂

Pour suivre ton raisonnement du post #37, il faut donc décompter les valeurs distinctes de la colonne B, soit les dossiers, après application des différents filtres.

Pour vérifier ce décompte, j'ai placé cette formule matricielle en U1 de la feuille "BD" et cela semble correspondre.
VB:
=SOMME(SI(FREQUENCE(SI(SOUS.TOTAL(103;DECALER(B2:B341;LIGNE(B2:B341)-MIN(LIGNE(B2:B341));0;1));EQUIV(B2:B341;B2:B341;0));LIGNE(B2:B341)-MIN(LIGNE(B2:B341))+1)>0;1))

Par contre, je ne comprends rien à cette partie.

Idem pour ceci :
edit: Grossière erreur de ma part, tous les résultats de la colonne Fa sont erronés. En effet, ils ne faut pas compter lorsqu'il y a une Ad. Pour avoir les bons chiffres, il faut diminuer le nombre des Ad de la colonne Fa.

klin89
 
Bonsoir @klin89 ,

Je te remercie infiniment de t'intéresser à mon problème. J'avoue que même moi je ne m'y retrouve plus.

Quant à la problématique du comptage des décès. Pour mieux, par exemple on enregistre l'entrée d'un chat le 12/04/2021. Dans la bd on enregistre 2 lignes: 1 Cd (avec enregistre de la personne qui le cède) et 1 Fa famille dans laquelle il est mis. Lors de son décès par exemple le 25/07/2024. cette date est enregistrée sur les 2 lignes créées lors de son entrée.
Donc ce décès doit être comptabilisé dans le tableau de l'année N soit en 2024.
Et non comptabilisé dans le tableau de toutes les années antérieures à l'année N, soit jusqu'au 31/12/2023.

Exact, on ne compte que les dossiers.
Merci pour ta formule matricielle.

Encore merci. Bonne soirée.
 
Bonjour,
voila pour test
Bonjour @dysorthographie ,

Je te remercie beaucoup, à très peu de chose le compte est bon.

Les quelques différences sont sûrement dues à des erreurs dans la bd.

Peux-tu m'expliquer au moins une ligne de code. J'ai constaté que tu jongles avec des 0,1,-1.

Je n'ai pas compris leur utilisation. Par exemple celle-ci:
VB:
    SqlTOut = SqlTOut & "SELECT DISTINCT NoDossier, Annee, [Espece], 1 AS CD, 0 AS FA,0 as AD,0 as ChFa,0 as RtAd,0 as adoptable,0 as NAdoptable,0 AS [A Déterminer],0 as DateDc FROM " & SqlTOutSdoublon & " WHERE UCASE([Cat]) = 'CD'" & vbCrLf

Tu viens de me faire une démonstration de la puissance de SQL.

Encore merci

Bonne journée.
 
Bonjour,
D’abord analysons le raisonnement :
  • 1. SqlTOutSdoublon c’ette requête récupère les données de l’onglet BD en extrayant les année des date et le tout sans doublon.

    AnnéesDosierCatEspeceCaractèreDateDC
    2010​
    2010027​
    CdChatNon Adoptable
    2010​
    2010027​
    FaChatNon Adoptable
    2011​
    2011017​
    CdChienNon Adoptable
    15/09/2024​
    2011​
    2011017​
    FaChienNon Adoptable
    15/09/2024​
    2015​
    2015003​
    AdChatAdoptable
    2015​
    2015003​
    CdChatAdoptable

  • 2. On fusionne ce tableau avec le tableau des résulta attendu
    Cd​
    Fa​
    Ad​
    ChFa​
    RtAd​
    Adoptable​
    Non Adoptable​
    A Déterminer​
    Décès​

    AnnéesDosierCatEspeceCaractèreDateDCCdFaAdChFaRtAd
    2010​
    2010027​
    CdChatNon Adoptable
    1​

 

Pièces jointes

Dernière édition:
Bonsoir @dysorthographie 😉,

Je te remercie infiniment. C'est top.

Bonne soirée.
 
VB:
' Crée une sous-requête distincte qui sélectionne les colonnes Année, NoDossier, Cat, Espece, Caractère, et DateDC depuis la table BD$
SqlTOutSdoublon = "(SELECT  DISTINCT year([Date]) as Annee,NoDossier,[Cat#],Espece,Caractère,DateDC FROM [BD$])"

' Début de la requête principale : Sélectionne des colonnes agrégées avec des sommes pour différentes catégories
SqlTOut = "SELECT Annee, Espece, sum(CD) as CD,sum(FA) as FA,sum(AD) as AD,sum(ChFa) as ChFa,Sum(RtAd) as RtAd,Sum(adoptable) as adoptable,Sum(NAdoptable) as NAdoptable,sum([A Déterminer]) as [A Déterminer],Sum(DateDc) as DateDc FROM (" & vbCrLf

' Ajoute une première sous-requête pour les catégories CD
SqlTOut = SqlTOut & "SELECT DISTINCT NoDossier, Annee, [Espece], 1 AS CD, 0 AS FA,0 as AD,0 as ChFa,0 as RtAd,0 as adoptable,0 as NAdoptable,0 AS [A Déterminer],0 as DateDc FROM " & SqlTOutSdoublon & " WHERE UCASE([Cat]) = 'CD'" & vbCrLf
' WHERE UCASE([Cat]) = 'CD' : Cette clause WHERE filtre les lignes où la colonne [Cat] contient 'CD'.

' UNION permet d'ajouter une autre sous-requête pour les catégories FA
SqlTOut = SqlTOut & "UNION ALL" & vbCrLf
SqlTOut = SqlTOut & "SELECT DISTINCT NoDossier, Annee, [Espece], 0 AS CD, 1 AS FA ,0 as AD,0 as ChFa,0 as RtAd,0 as adoptable,0 as NAdoptable,0 AS [A Déterminer],0 as DateDc FROM " & SqlTOutSdoublon & " WHERE UCASE([Cat]) = 'FA'" & vbCrLf
' WHERE UCASE([Cat]) = 'FA' : Filtre les lignes où la colonne [Cat] contient 'FA'.

' UNION pour ajouter les catégories AD
SqlTOut = SqlTOut & "UNION ALL" & vbCrLf
SqlTOut = SqlTOut & "SELECT DISTINCT NoDossier, Annee, [Espece], 0 AS CD, 0 AS FA,1 as AD,0 as ChFa,0 as RtAd,0 as adoptable,0 as NAdoptable,0 AS [A Déterminer],0 as DateDc FROM " & SqlTOutSdoublon & " WHERE UCASE([Cat]) = 'AD'" & vbCrLf
' WHERE UCASE([Cat]) = 'AD' : Filtre les lignes où la colonne [Cat] contient 'AD'.

' UNION pour ajouter les catégories CHFA
SqlTOut = SqlTOut & "UNION ALL" & vbCrLf
SqlTOut = SqlTOut & "SELECT DISTINCT NoDossier, Annee, [Espece], 0 AS CD, 0 AS FA,0 as AD,1 as ChFa,0 as RtAd,0 as adoptable,0 as NAdoptable,0 AS [A Déterminer],0 as DateDc FROM " & SqlTOutSdoublon & " WHERE UCASE([Cat]) = 'CHFA'" & vbCrLf
' WHERE UCASE([Cat]) = 'CHFA' : Filtre les lignes où la colonne [Cat] contient 'CHFA'.

' UNION pour ajouter les catégories RTAD
SqlTOut = SqlTOut & "UNION ALL" & vbCrLf
SqlTOut = SqlTOut & "SELECT DISTINCT NoDossier, Annee, [Espece], 0 AS CD, 0 AS FA,0 as AD,0 as ChFa,1 as RtAd ,0 as adoptable,0 as NAdoptable,0 AS [A Déterminer],0 as DateDc FROM " & SqlTOutSdoublon & " WHERE UCASE([Cat]) = 'RTAD'" & vbCrLf
' WHERE UCASE([Cat]) = 'RTAD' : Filtre les lignes où la colonne [Cat] contient 'RTAD'.

' UNION pour ajouter les dossiers adoptables dans la catégorie FA
SqlTOut = SqlTOut & "UNION ALL" & vbCrLf
SqlTOut = SqlTOut & "SELECT DISTINCT NoDossier, Annee, [Espece], 0 AS CD, 0 AS FA,0 as AD,0 as ChFa,0 as RtAd ,1 as adoptable,0 as NAdoptable,0 AS [A Déterminer],0 as DateDc FROM " & SqlTOutSdoublon & " WHERE UCASE([Cat]) = 'FA' AND UCASE([Caractère]) = 'ADOPTABLE'" & vbCrLf
' WHERE UCASE([Cat]) = 'FA' AND UCASE([Caractère]) = 'ADOPTABLE' : Filtre les lignes où [Cat] est 'FA' et [Caractère] est 'ADOPTABLE'.
' Cela permet de sélectionner uniquement les dossiers FA qui sont adoptables.

' UNION pour ajouter les dossiers non adoptables dans la catégorie FA
SqlTOut = SqlTOut & "UNION ALL" & vbCrLf
SqlTOut = SqlTOut & "SELECT DISTINCT NoDossier, Annee, [Espece], 0 AS CD, 0 AS FA,0 as AD,0 as ChFa,0 as RtAd ,0 as adoptable,1 as NAdoptable,0 AS [A Déterminer],0 as DateDc FROM " & SqlTOutSdoublon & " WHERE UCASE([Cat]) = 'FA' AND UCASE([Caractère]) = 'NON ADOPTABLE'" & vbCrLf
' WHERE UCASE([Cat]) = 'FA' AND UCASE([Caractère]) = 'NON ADOPTABLE' : Filtre les lignes où [Cat] est 'FA' et [Caractère] est 'NON ADOPTABLE'.
' Cela sélectionne uniquement les dossiers FA qui ne sont pas adoptables.

' UNION pour les dossiers ayant une DateDc non nulle
SqlTOut = SqlTOut & "UNION ALL" & vbCrLf
SqlTOut = SqlTOut & "SELECT DISTINCT NoDossier,year(DateDc) as  Annee, [Espece], 0 AS CD, 0 AS FA,0 as AD,0 as ChFa,0 as RtAd ,0 as adoptable,0 as NAdoptable,1 as DateDc FROM " & SqlTOutSdoublon & " WHERE[DateDc]  is not null" & vbCrLf
' WHERE [DateDc] is not null : Filtre les lignes où la colonne [DateDc] contient une valeur non nulle, c'est-à-dire où une date de décès est enregistrée.

' UNION pour les catégories FA ayant une DateDc non nulle
SqlTOut = SqlTOut & "UNION ALL" & vbCrLf
SqlTOut = SqlTOut & "SELECT DISTINCT NoDossier,year(DateDc) as  Annee, [Espece], 0 AS CD, -1 AS FA,0 as AD,0 as ChFa,0 as RtAd ,0 as adoptable,0 as NAdoptable,0 AS [A Déterminer],0 as DateDc FROM " & SqlTOutSdoublon & " WHERE  UCASE([Cat]) = 'FA' AND[DateDc]  is not null" & vbCrLf
' WHERE UCASE([Cat]) = 'FA' AND [DateDc] is not null : Filtre les lignes où [Cat] est 'FA' et où une date de décès est enregistrée.

' UNION pour les dossiers adoptables ayant une DateDc non nulle
SqlTOut = SqlTOut & "UNION ALL" & vbCrLf
SqlTOut = SqlTOut & "SELECT DISTINCT NoDossier,year(DateDc) as  Annee, [Espece], 0 AS CD, 0 AS FA,0 as AD,0 as ChFa,0 as RtAd ,-1 as adoptable,0 as NAdoptable,0 AS [A Déterminer],0 as DateDc FROM " & SqlTOutSdoublon & " WHERE  [DateDc]  is not null AND UCASE([Caractère]) = 'ADOPTABLE'" & vbCrLf
' WHERE [DateDc] is not null AND UCASE([Caractère]) = 'ADOPTABLE' : Sélectionne les dossiers adoptables qui ont une date de décès enregistrée.

' UNION pour les dossiers non adoptables ayant une DateDc non nulle
SqlTOut = SqlTOut & "UNION ALL" & vbCrLf
SqlTOut = SqlTOut & "SELECT DISTINCT NoDossier,year(DateDc) as  Annee, [Espece], 0 AS CD, 0 AS FA,0 as AD,0 as ChFa,0 as RtAd ,0 as adoptable,-1 as NAdoptable,0 AS [A Déterminer],0 as DateDc FROM " & SqlTOutSdoublon & " WHERE  [DateDc]  is not null AND UCASE([Caractère]) = 'NON ADOPTABLE'" & vbCrLf
' WHERE [DateDc] is not null AND UCASE([Caractère]) = 'NON ADOPTABLE' : Sélectionne les dossiers non adoptables qui ont une date de décès enregistrée.

' UNION pour ajouter une sous-requête qui sélectionne tous les dossiers avec des valeurs par défaut pour les catégories
SqlTOut = SqlTOut & "UNION ALL" & vbCrLf
SqlTOut = SqlTOut & "SELECT DISTINCT NoDossier, Annee, 'Tous' as Espece,0 AS CD,0 as FA,0 as AD,0 as ChFa,0 as RtAd,0 as adoptable,0 as NAdoptable,0 as [A Déterminer],0 as DateDc  FROM " & SqlTOutSdoublon & vbCrLf

' Fermeture de la requête principale avec une clause GROUP BY pour agrégations par Année et Espèce
SqlTOut = SqlTOut & ") GROUP BY Annee,Espece" & vbCrLf

Explication de la Requête SQL​

Dans ma requête SQL, j'utilise différentes valeurs pour gérer des informations concernant des animaux, en particulier pour les catégories et les décès. Voici comment les valeurs 1, 0, et -1 sont utilisées :

  1. Valeur 1:
    • J'attribue 1 à une colonne (comme CD, FA, AD, etc.) lorsque la condition correspondante est remplie. Par exemple, si un dossier appartient à la catégorie CD, je mets 1 dans la colonne CD. Cela permet de compter facilement combien d'animaux se trouvent dans chaque catégorie.
  2. Valeur 0:
    • La valeur 0 est utilisée pour les catégories où la condition n'est pas remplie. Par exemple, si un dossier ne fait pas partie de la catégorie FA, je mets 0 dans la colonne FA. Cela m'assure que cette catégorie ne contribue pas au total, tout en maintenant la structure des résultats.
  3. Valeur -1:
    • J'utilise -1 pour représenter des situations spécifiques, notamment les décès des animaux. Lorsque la colonne [DateDc] n'est pas nulle, cela indique qu'un animal est décédé. Dans ce cas, je mets -1 dans certaines colonnes pour indiquer une condition négative. Cela m'aide à distinguer les cas où un animal est décédé des autres catégories.

Détails de la Requête​

  • La requête commence par définir une sous-requête SqlTOutSdoublon, qui sélectionne des données distinctes des dossiers, y compris l'année, le numéro de dossier, la catégorie, l'espèce, le caractère, et la date de décès.
  • Ensuite, dans la requête principale SqlTOut, j'effectue plusieurs sélections avec UNION ALL pour agréger les résultats. Chaque sélection correspond à une catégorie spécifique :
    • Pour CD, FA, et AD, j'utilise 1 ou 0 selon la catégorie.
    • Pour ChFa, RtAd, adoptable, et NAdoptable, j'affecte 0 ou 1 selon les conditions, comme lorsqu'un animal est marqué comme adoptable ou non.
  • À la fin de la requête, je fais la somme des valeurs dans chaque colonne. Par exemple, si je prends une colonne avec des valeurs comme 1 (pour un animal vivant), 0 (pour un animal non concerné), et -1 (pour un animal décédé), la somme serait :
    1+0+(−1)=0
    Cette opération soustrait effectivement les décès du total, ce qui me permet de comprendre combien d'animaux sont comptabilisé pour chaque années et dans chaque catégorie.

Conclusion​

En résumé, l'utilisation de 1, 0, et -1 me permet de gérer efficacement les différentes catégories d'animaux dans la base de données. Cela facilite l'agrégation et le comptage des résultats dans ma requête SQL, me permettant d'obtenir des totaux précis tout en prenant en compte les décès des animaux.
 
Dernière édition:
Bonjour à toutes et à tous,

Pour le partage, je vous donne ma solution. Notez bien que je ne suis arrivé à ce résultat que grâce à votre aide.
Et de recherches sur le forum et le net.
Je suis autodidacte et je fonctionne avec mes maigres acquis. Donc le code n'est pas au top mais fait le boulot.
Je sais qu'on peut l'améliorer et le simplifier. J'ai passé tellement de temps que je n'ose pas m'y aventurer.
Je pourrais vous répondre sur la finalité du code mais je ne pourrai pas vous expliquer certaines parties de code.
Accepte toutes critiques constructives. Merci pour indulgence.

Bonne journée.
 

Pièces jointes

- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
40
Affichages
3 K
Réponses
11
Affichages
176
Réponses
3
Affichages
205
Réponses
6
Affichages
163
Réponses
12
Affichages
245
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…