IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes et SQL. Discussion :

Requête Analyse croisée [AC-2007]


Sujet :

Requêtes et SQL.

  1. #1
    Membre régulier
    Femme Profil pro
    Inscrit en
    Juin 2012
    Messages
    258
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 258
    Points : 87
    Points
    87
    Par défaut Requête Analyse croisée
    Bonjour,
    Je ne sais pas trop si mon problème se solutionne via requête ou via formulaire, mais je vous l'expose tout de même ici.

    J'ai des adhérents des deux sexes (M et F), et j'ai leur âge.

    Je souhaite savoir combien d'adhérents j'ai par sexe et par tranches d'âge.

    J'arrive à faire ma requête selon tous les âges, mais je ne parviens pas à les grouper par tranches (directement dans l'état non plus) :
    moins de 10 ans
    11-12 ans
    13-15 ans
    16-18 ans
    plus de 18 ans.

    Merci pour votre aide

  2. #2
    Membre expert
    Avatar de FreeAccess
    Homme Profil pro
    Un monde ou prendre est plus facile qu'apprendre.
    Inscrit en
    Mars 2006
    Messages
    2 745
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Un monde ou prendre est plus facile qu'apprendre.

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 745
    Points : 3 834
    Points
    3 834
    Par défaut
    Bonjour,

    Sur ce lien, tu trouveras ton bonheur... (à adapter)

    Requêtes

  3. #3
    Membre régulier
    Femme Profil pro
    Inscrit en
    Juin 2012
    Messages
    258
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 258
    Points : 87
    Points
    87
    Par défaut
    Merci, j'y trouve mon bonheur oui et non car je ne comprends pas tout et mes plages ne sont pas régulières.

  4. #4
    Membre expert
    Avatar de FreeAccess
    Homme Profil pro
    Un monde ou prendre est plus facile qu'apprendre.
    Inscrit en
    Mars 2006
    Messages
    2 745
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Un monde ou prendre est plus facile qu'apprendre.

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 745
    Points : 3 834
    Points
    3 834
    Par défaut
    ...exemple de requête à adapter à ton application.... (c'est une possibilité)

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT b.sexe AS CatSexe ,
    sum(iif(b.age <= 10 , 1 , 0)) AS Moins10 , 
    sum(iif(b.age between 11 and 12 , 1 , 0)) AS Entre1112 , 
    sum(iif(b.age between 13 and 15 , 1 , 0)) AS Entre1315 , 
    sum(iif(b.age between 16 and 18 , 1 , 0)) AS Entre1618 , 
    sum(iif(b.age > 18 , 1 , 0)) AS Plus18
    FROM  T_Adherents AS b
    GROUP BY b.sexe;

    ... normalement il n'y a pas de fautes....

  5. #5
    Membre régulier
    Femme Profil pro
    Inscrit en
    Juin 2012
    Messages
    258
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 258
    Points : 87
    Points
    87
    Par défaut
    Je testerai demain au boulot.
    Je crée ma requête en mode SQL c'est bien cela ?

  6. #6
    Membre expert
    Avatar de FreeAccess
    Homme Profil pro
    Un monde ou prendre est plus facile qu'apprendre.
    Inscrit en
    Mars 2006
    Messages
    2 745
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Un monde ou prendre est plus facile qu'apprendre.

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 745
    Points : 3 834
    Points
    3 834
    Par défaut
    C'est tout à fait cela . . .

    - Tu crées une nouvelle requête . . . sans aucune table.
    - Clic droit > Mode SQL
    - Copier/coller du SQL proposé

    Normalement, j'ai respecté le nom des champs de ta table
    Il te faut juste changer [FROM T_Adherents AS b] par le nom de ta table

  7. #7
    Membre régulier
    Femme Profil pro
    Inscrit en
    Juin 2012
    Messages
    258
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 258
    Points : 87
    Points
    87
    Par défaut
    Merci beaucoup!
    Je viens juste de me souvenir de "AS" en relisant une fois de plus le code, hou la la que ça fait longtemps que je n'ai pas programmé!

  8. #8
    Membre régulier
    Femme Profil pro
    Inscrit en
    Juin 2012
    Messages
    258
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 258
    Points : 87
    Points
    87
    Par défaut
    Bon, ça se complique, on me demande de le faire pour plusieurs années, du coup l'âge doit être calculé à partir d'une date saisie dans un formulaire.

    J'ai tenté en SQL mais ça ne fonctionne pas


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT b.sexe AS CatSexe, DateDiff("yyyy",[date naissance],[forms]![accueil].[deb]) AS age,
    sum(iif(b.age <= 10 , 1 , 0)) AS Moins10 , 
    sum(iif(b.age BETWEEN 11 AND 12 , 1 , 0)) AS Entre1112 , 
    sum(iif(b.age BETWEEN 13 AND 15 , 1 , 0)) AS Entre1315 , 
    sum(iif(b.age BETWEEN 16 AND 18 , 1 , 0)) AS Entre1618 , 
    sum(iif(b.age > 18 , 1 , 0)) AS Plus18
    FROM Adhérents AS b
    GROUP BY b.sexe;

  9. #9
    Membre expert
    Avatar de FreeAccess
    Homme Profil pro
    Un monde ou prendre est plus facile qu'apprendre.
    Inscrit en
    Mars 2006
    Messages
    2 745
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Un monde ou prendre est plus facile qu'apprendre.

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 745
    Points : 3 834
    Points
    3 834
    Par défaut
    Bonjour,

    Ok, donc dans ce contexte le champ [age] ne sert à rien. . .
    Seul le champ [date_naissance] a une utilité . .

    On peut se servir d'une fonction pour le calcul exact de l'âge....
    Comment calculer l'âge d'une personne ?
    .... et l'utiliser dans la requête...
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    Moins10: Somme(VraiFaux(calculage([Date_naissance];[forms]![formulaire]![champ])<=10;1;0))

    ... et ce qui donne au final
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT T_Adherents.Sexe,
    Sum(IIf(calculage([Date_naissance],[forms]![formulaire]![champ])<=10,1,0)) AS Moins10,
    Sum(IIf(calculage([Date_naissance],[forms]![formulaire]![champ]) Between 11 And 12,1,0)) AS Entre1112,
    Sum(IIf(calculage([Date_naissance],[forms]![formulaire]![champ]) Between 13 And 15,1,0)) AS Entre1315,
    Sum(IIf(calculage([Date_naissance],[forms]![formulaire]![champ]) Between 16 And 18,1,0)) AS Entre1618,
    Sum(IIf(calculage([Date_naissance],[forms]![formulaire]![champ])>18,1,0)) AS Plus18
    FROM T_Adherents
    GROUP BY T_Adherents.Sexe;

    ... cette requête fonctionne correctement. A améliorer .....

  10. #10
    Membre régulier
    Femme Profil pro
    Inscrit en
    Juin 2012
    Messages
    258
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 258
    Points : 87
    Points
    87
    Par défaut
    J'ai réussi à avoir quelque chose qui fonctionne avec

    SELECT Adhérents.sexe, DateDiff("yyyy",[date naissance],[forms]![accueil].[deb]) AS AGE,
    Sum(IIf(age<=10,1,0)) AS Moins10,
    Sum(IIf(age Between 11 And 12,1,0)) AS Entre1112,
    Sum(IIf(age Between 13 And 15,1,0)) AS Entre1315,
    Sum(IIf(age Between 16 And 18,1,0)) AS Entre1618, Sum(IIf(age>18,1,0)) AS Plus18
    FROM Adhérents
    GROUP BY Adhérents.sexe, DateDiff("yyyy",[date naissance],[forms]![accueil].[deb]);

    Mais ça ne me donne pas ce que que je voudrais.

    J'ai autant de lignes que j'ai d'âge

    sexe AGE Moins10 Entre1112 Entre1315 Entre1618 Plus18
    f 0 0 0 0 0
    f 12 0 3 0 0 0
    f 13 0 0 1 0 0
    f 14 0 0 1 0 0
    f 15 0 0 4 0 0
    f 16 0 0 0 3 0
    m 0 0 0 0 0
    m 12 0 2 0 0 0
    m 13 0 0 5 0 0
    m 14 0 0 8 0 0
    m 15 0 0 8 0 0
    m 16 0 0 0 2 0
    m 17 0 0 0 1 0
    m 18 0 0 0 1 0
    m 21 0 0 0 0 1


    et moi je voudrais

    sexe Moins10 Entre1112 Entre1315 Entre161 Plus18
    f
    m

  11. #11
    Membre régulier
    Femme Profil pro
    Inscrit en
    Juin 2012
    Messages
    258
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 258
    Points : 87
    Points
    87
    Par défaut
    La fonction calculage est intéressante.
    Je la crée où ?

    Et du coup, on me "complique" encore la tâche, il faut que j'aille chercher le premier jour d'une activité dans la table activité pour calculer l'âge exact de chacun par rapport au premier jour de l'activité (ou des activités) à laquelle ils ont participé.

    j'ai ma table adhérents avec le champ [date naissance]
    liée à la table inscriptions
    et la table inscriptions liée à la table activités
    mon champ [dj 1] est dans activité est le premier jour de l activité

  12. #12
    Membre expert
    Avatar de FreeAccess
    Homme Profil pro
    Un monde ou prendre est plus facile qu'apprendre.
    Inscrit en
    Mars 2006
    Messages
    2 745
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Un monde ou prendre est plus facile qu'apprendre.

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 745
    Points : 3 834
    Points
    3 834
    Par défaut
    On commence par le début ...
    Je la crée où ?
    Onglet Créer > Groupe Autre > Sous Macro > choisir Module
    (ou tout simplement Alt-F11)

    Dans un nouveau Module, tu fais un copier/coller de la fonction proposée, en la modifiant quelque peu....tu rajoutes, juste devant le mot Public (de façon à ce que celle ci soit accessible partout dans l'application)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Public Function CalculAge(ByVal Dat1 As Date, ByVal Dat2 As Date) As Integer
    . . .
    Pour la deuxième question, je ne vois même pas la difficulté que tu as

  13. #13
    Membre régulier
    Femme Profil pro
    Inscrit en
    Juin 2012
    Messages
    258
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 258
    Points : 87
    Points
    87
    Par défaut
    J'ai vraiment beaucoup de mal à m'y remettre

    J'obtiens le bon résultat lors de la mise en page de l'état.

    Il me reste juste à créer ma fonction calculage et insérer des pourcentages dans l'état en plus des quantités.

    Merci beaucoup pour cette aide!

  14. #14
    Membre régulier
    Femme Profil pro
    Inscrit en
    Juin 2012
    Messages
    258
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 258
    Points : 87
    Points
    87
    Par défaut
    Voici ma requête

    SELECT DISTINCT Adhérents.N°, Adhérents.sexe, CALCULAGE([date naissance],[dj 1]) AS AGE,
    Sum(IIf(age<=10,1,0)) AS Moins10,
    Sum(IIf(age Between 11 And 12,1,0)) AS Entre1112,
    Sum(IIf(age Between 13 And 15,1,0)) AS Entre1315,
    Sum(IIf(age Between 16 And 18,1,0)) AS Entre1618,
    Sum(IIf(age>18,1,0)) AS Plus18, CATEGORIES.Catégorie
    FROM CATEGORIES INNER JOIN (ACT INNER JOIN (Activités INNER JOIN (Adhérents INNER JOIN Inscriptions ON Adhérents.N° = Inscriptions.Adhérent) ON Activités.Num = Inscriptions.Activité) ON ACT.Num = Activités.Activité) ON CATEGORIES.Num = ACT.Catégories
    GROUP BY Adhérents.N°, Adhérents.sexe, CALCULAGE([date naissance],[dj 1]), CATEGORIES.Catégorie, Activités.[DJ 1], ACT.Catégories
    HAVING (((Activités.[DJ 1]) Between [forms]![accueil].[deb] And [forms]![accueil].[fin]) AND ((ACT.Catégories)=[forms]![accueil].[cat]))
    ORDER BY Adhérents.N°;


    qui ne fonctionne malheureusement pas (avec datediff à la place de calculage, ça fonctionne)

    "Cette expression présente une syntaxe incorrecte, ou est trop complexe pour être évaluée. Par exemple, une expression numérique peut contenir des éléments trop compliqués. Essayez de la simplifier en en affectant des parties à des variables.





    Option Compare Database

    Public Function CalculAge(ByVal Dat1 As Date, ByVal Dat2 As Date) As Integer
    If Month(Dat2) > Month(Dat1) Then
    CalculAge = DateDiff("yyyy", Dat1, Dat2)
    ElseIf Month(Dat2) = Month(Dat1) Then
    If Day(Dat2) >= Day(Dat1) Then
    CalculAge = DateDiff("yyyy", Dat1, Dat2)
    Else
    CalculAge = DateDiff("yyyy", Dat1, Dat2) - 1
    End If
    Else
    CalculAge = DateDiff("yyyy", Dat1, Dat2) - 1
    End If
    End Function

  15. #15
    Membre expert
    Avatar de FreeAccess
    Homme Profil pro
    Un monde ou prendre est plus facile qu'apprendre.
    Inscrit en
    Mars 2006
    Messages
    2 745
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Un monde ou prendre est plus facile qu'apprendre.

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 745
    Points : 3 834
    Points
    3 834
    Par défaut
    Heu . . .là, je ne comprends plus ce que tu souhaites obtenir

    ...calculer l'âge exact de chacun par rapport au premier jour de l'activité
    . . . donc ici, tu n'as pas besoin d'un regroupement par Sexe et sur des tranches d'âge

    Moi, ce que je comprends:

    -pour chacun des adhérents, calculer l'âge qu'il avait lors de tel ou tel activité par rapport à cette date (champ [dj 1] est dans activité est le premier jour de l activité)

    [EDIT] utilise les tag code ( [#] )quand tu mets du code en exemple ...

  16. #16
    Membre régulier
    Femme Profil pro
    Inscrit en
    Juin 2012
    Messages
    258
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 258
    Points : 87
    Points
    87
    Par défaut
    Dans ma table Adhérents, j'ai la date de naissance
    Dans ma table Activité, j'ai la date de début d'activité.

    Je veux donc l'âge de chaque adhérent au début de chaque activité à laquelle il a participé.

    ça c'est ok

    Mais je veux en plus distinguer les filles des garçons

    Pour à la fin obtenir un tableau avec en colonnes et les tranches d'âge
    et en ligne les sexes.
    Peut-être que c'est inutile dans la requête et que ça se passe au niveau de l'état.


    Comme au-dessus de moi, ils ne savent pas trop quelle date prendre, je vais pour l instant me baser sur datediff, la fonction calculage me servant pour valider ou non une inscription avec âge minimal.

  17. #17
    Membre expert
    Avatar de FreeAccess
    Homme Profil pro
    Un monde ou prendre est plus facile qu'apprendre.
    Inscrit en
    Mars 2006
    Messages
    2 745
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Un monde ou prendre est plus facile qu'apprendre.

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 745
    Points : 3 834
    Points
    3 834
    Par défaut
    Peut-être y a t'il une erreur dans ta phrase . . . mais quelle différence avec la requête d'origine
    Pour à la fin obtenir un tableau avec en colonnes et les tranches d'âge
    et en ligne les sexes. . . . je veux en plus distinguer les filles des garçons
    ..... c'est bien ce que la requête te retourne
    Images attachées Images attachées  

  18. #18
    Membre régulier
    Femme Profil pro
    Inscrit en
    Juin 2012
    Messages
    258
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 258
    Points : 87
    Points
    87
    Par défaut
    Oui, c'est ce que la requête me retourne en effet, c'était pour répondre

    à ". . . donc ici, tu n'as pas besoin d'un regroupement par Sexe et sur des tranches d'âge "

    Apparemment, mon état est ok en prenant datediff (on ne sait pas trop si il faut prendre l'âge exact ou l'âge dans l'année, donc je laisse comme ça pour l'instant).

    Merci

    pour le tag code, je ne savais pas, j'essaierai de l'utiliser par la suite.

  19. #19
    Membre expert
    Avatar de FreeAccess
    Homme Profil pro
    Un monde ou prendre est plus facile qu'apprendre.
    Inscrit en
    Mars 2006
    Messages
    2 745
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Un monde ou prendre est plus facile qu'apprendre.

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 745
    Points : 3 834
    Points
    3 834
    Par défaut
    Ok . . . par contre pour ce message d'erreur.
    "Cette expression présente une syntaxe incorrecte, ou est trop complexe pour être évaluée. Par exemple, une expression numérique peut contenir des éléments trop compliqués. Essayez de la simplifier en en affectant des parties à des variables.
    . . . c'est souvent le fait, qu'une de tes dates n'est pas conforme

    Ainsi date = "22/0/2012" ou "31/06/2012" retourne ce type d'erreur

  20. #20
    Membre régulier
    Femme Profil pro
    Inscrit en
    Juin 2012
    Messages
    258
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 258
    Points : 87
    Points
    87
    Par défaut
    Citation Envoyé par FreeAccess Voir le message
    Ok . . . par contre pour ce message d'erreur.

    . . . c'est souvent le fait, qu'une de tes dates n'est pas conforme

    Ainsi date = "22/0/2012" ou "31/06/2012" retourne ce type d'erreur
    les deux champs sont stockés dans un type date pourtant

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 7
    Dernier message: 04/09/2011, 19h14
  2. Requête analyse croisée sous SQL SERVER
    Par motus_z dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 23/02/2006, 17h54
  3. Zones vides dans Requête Analyse croisée
    Par sbeprod dans le forum Access
    Réponses: 2
    Dernier message: 12/12/2005, 15h03
  4. Requête Analyse Croisée
    Par Daniel MOREAU dans le forum Access
    Réponses: 1
    Dernier message: 07/11/2005, 19h13
  5. Requêtes analyses croisées sous SQL Server 2000
    Par callo dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 24/09/2005, 20h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo