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 :

Assemblage sous requêtes


Sujet :

Requêtes et SQL.

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Juin 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2008
    Messages : 31
    Points : 20
    Points
    20
    Par défaut Assemblage sous requêtes
    Bonjour,

    débutant dans le sql et encore, juste des requêtes pour le boulot avec MS Query, je patauge un PEU pour celle-ci.

    Le contexte : base sql pour la traçabilité de soutirages de vins. Je vais me servir de deux champs d'une seule table. L'un contient les dates de ces soutirages et l'autre les codes EAN correspondant au vins soutirés.

    Je veux récupérer le nombre de références (vins) différentes soutirées par mois.
    Je précise qu'une référence correspond à 1 vin sans son millésime. Un Domaine Bidule 2005 ou 2006 est tjs un Domaine Bidule et donc 1 même référence.
    Pour cela je vais me servir des codes EAN dont je vais prendre les 11 premiers chiffres, le 12è c'est le millésime (en général), et le 13è, comme dans tout code EAN13, il ne me sert à rien.

    Je joint la petite table que j'ai créé en Access pour tester tout ça.
    EDIT : Ah ben non, les .mdb, a veut po ... Toute façon pas dur 1 champ avec dates et l'autre, les codes ean

    Alors pour compter les références différentes (en 2008) j'ai fait ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT COUNT(*) AS REFERENCES
    FROM (SELECT DISTINCT LEFT(lot_soutirages.code_ean,11) AS EAN11
             FROM yti.lot_soutirages lot_soutirages
             WHERE (lot_soutirage.code_ean<>'0' 
             AND lot_soutirages.date_soutirage>#01/01/2008#)
             ) AS T
    Ça fonctionne très bien

    Pour compter le nombre de références par mois (en 2008), ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT MONTH(lot_soutirages.date_soutirage) & '/' & YEAR(lot_soutirages.date_soutirage) AS MOIS, 
            COUNT(*) AS REFERENCES
    FROM yti.lot_soutirages lot_soutirages
    WHERE (YEAR(lot_soutirage.date_soutirage)=2008)
    GROUP BY YEAR(lot_soutirages.date_soutirage),
            MONTH(lot_soutirages.date_soutirage)
    Qui fonctionne très bien aussi.

    Maintenant, j'essaie de sortir par mois, le nombre de références différentes ... Et j'arrive po. J'ai essayé deux trois choses hier soir mais me souviens plus trop, il était tard

    Ben voilà, si quelqu'un peut me donner des pistes, je suis preneur.
    Pendant ce temps, j'y retourne !


    Fredche

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    COUNT(DISTINCT LaColonneACompter)

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Bonjour,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT 
          MONTH(ls.date_soutirage) & '/' & YEAR(ls.date_soutirage) AS MOIS, 
          COUNT(DISTINCT LEFT(ls.code_ean,11)) AS Nb_References
    FROM yti.lot_soutirages ls
    WHERE (YEAR(ls.date_soutirage)=2008)
    GROUP BY MONTH(ls.date_soutirage) & '/' & YEAR(ls.date_soutirage)
    ORDER BY MONTH(ls.date_soutirage) & '/' & YEAR(ls.date_soutirage)

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 388
    Points
    18 388
    Par défaut
    La même requête peu s'écrire ainsi (si c'est bien du SQL Server) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      SELECT CONVERT(VARCHAR(7), ls.date_soutirage, 111) AS MOIS, 
             COUNT(DISTINCT LEFT(ls.code_ean, 11)) AS Nb_References
        FROM yti.lot_soutirages ls
       WHERE ls.date_soutirage >= CAST('2008-01-01' AS SMALLDATETIME)
         AND ls.date_soutirage <  CAST('2009-01-01' AS SMALLDATETIME)
    GROUP BY CONVERT(VARCHAR(7), ls.date_soutirage, 111)
    ORDER BY CONVERT(VARCHAR(7), ls.date_soutirage, 111)

  5. #5
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Juin 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2008
    Messages : 31
    Points : 20
    Points
    20
    Par défaut
    Merci pour ces réponses rapides.

    Effectivement j'avais pas penser à faire comme ça, on voit le ptit nouveau

    J'ai donc fait comme proposé mais MS Query n'en veut pas :

    "Syntax error [missing operator] in query expression : 'COUNT(DISTINCT LEFT(lot_soutirages.code_ean,11))' "

    Quid ?`

    Du coup, j'ai essayé sur le code ean en entier donc sans le LEFT.
    Et là il veut plus du & '/' & de ma concaténation ...

    Si je mets, et je ne sais pas si c'est judicieux des () autour de ma concaténation, j'ai droit à un : "Undefined function 'DISTINCT' in expression.

    Et bé

    Sur ce vais manger un bout et pi j'y retourne. Tjs motivé.

  6. #6
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Juin 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2008
    Messages : 31
    Points : 20
    Points
    20
    Par défaut
    Citation Envoyé par Waldar Voir le message
    La même requête peu s'écrire ainsi (si c'est bien du SQL Server) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      SELECT CONVERT(VARCHAR(7), ls.date_soutirage, 111) AS MOIS, 
             COUNT(DISTINCT LEFT(ls.code_ean, 11)) AS Nb_References
        FROM yti.lot_soutirages ls
       WHERE ls.date_soutirage >= CAST('2008-01-01' AS SMALLDATETIME)
         AND ls.date_soutirage <  CAST('2009-01-01' AS SMALLDATETIME)
    GROUP BY CONVERT(VARCHAR(7), ls.date_soutirage, 111)
    ORDER BY CONVERT(VARCHAR(7), ls.date_soutirage, 111)
    Malheureusement, je ne dispose pas de SQL Server, je fais des requêtes dans MS Query et récupère les résultats dans excel...

  7. #7
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Juin 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2008
    Messages : 31
    Points : 20
    Points
    20
    Par défaut
    En fait, en faisant quelques recherches, et si j'ai bien compris Access et MSQuery ne veulent pas du COUNT(Distinct).

    Je vais devoir passer par des sous-requêtes.

    J'ai toujours un peu d'espoir d'y arriver ... aujourd'hui

  8. #8
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Juin 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2008
    Messages : 31
    Points : 20
    Points
    20
    Par défaut
    Bon voilà, après une soirée 'Freeze' organisée par mon pc , et une couche de vernis sur le chalet de jardin, je reviens à mon ptit problème.

    Donc: pas de COUNT DISTINCT dans MS Query (et Access).
    Je supprime pour l'instant le LEFT pour 11 chiffres au lieu de 13 dans le code ean et aussi la concaténation mois/année, je tente qqch comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT COUNT(T1.code_ean), YEAR(T1.date_soutirage), MONTH(T1.date_soutirage)
    FROM
    	(SELECT DISTINCT (ls.code_ean),
                  YEAR(ls.date_soutirage), MONTH(ls.date_soutirage)
    	FROM `yti`.lot_soutirages ls
    	ORDER BY YEAR(ls.date_soutirage), MONTH(ls.date_soutirage)) AS T1
     
    GROUP BY YEAR(T1.date_soutirage), MONTH(T1.date_soutirage)
    ORDER BY YEAR(T1.date_soutirage), MONTH(T1.date_soutirage)

    MAIS Ms Query " ne trouve pas la table 'SELECT "

    Par contre, si je veux juste faire un COUNT :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT COUNT(T1.code_ean)
    FROM
    	(SELECT DISTINCT (ls.code_ean),
                  YEAR(ls.date_soutirage), MONTH(ls.date_soutirage)
    	FROM `yti`.lot_soutirages ls
    	ORDER BY YEAR(ls.date_soutirage), MONTH(ls.date_soutirage)) AS T1
    Ça marche ...

    Quid ?

    Si une bonne âme (ou un pro ) voit ce qui cloche, je suis preneur.

  9. #9
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 758
    Points : 57 779
    Points
    57 779
    Billets dans le blog
    42
    Par défaut
    bonsoir,

    peut-être comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT COUNT(T1.code_ean), T1.AnneeSoutirage, T1.MoisSoutirage
    FROM
    	(SELECT DISTINCT (ls.code_ean),
                  YEAR(ls.date_soutirage) AS AnneeSoutirage, MONTH(ls.date_soutirage) AS MoisSoutirage
    	FROM `yti`.lot_soutirages ls
    	ORDER BY YEAR(ls.date_soutirage), MONTH(ls.date_soutirage)) AS T1
     
    GROUP BY T1.AnneeSoutirage, T1.MoisSoutirage
    ORDER BY T1.AnneeSoutirage, T1.MoisSoutirage

  10. #10
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Juin 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2008
    Messages : 31
    Points : 20
    Points
    20
    Par défaut
    Merci, je testerai ça lundi au boulot car là mon pc est out.
    A peine démarré et hop, freeze !
    Et suis en congé jusque lundi.
    Je tiens au courant.

    Fredche

  11. #11
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Juin 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2008
    Messages : 31
    Points : 20
    Points
    20
    Par défaut
    Alors, après quelques déboires non encore résolus avec ce fo!#$% PC, j'ai repris l'affaire au boulot.

    Citation Envoyé par f-leb Voir le message
    bonsoir,

    peut-être comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT COUNT(T1.code_ean), T1.AnneeSoutirage, T1.MoisSoutirage
    FROM
    	(SELECT DISTINCT (ls.code_ean),
                  YEAR(ls.date_soutirage) AS AnneeSoutirage, MONTH(ls.date_soutirage) AS MoisSoutirage
    	FROM `yti`.lot_soutirages ls
    	ORDER BY YEAR(ls.date_soutirage), MONTH(ls.date_soutirage)) AS T1
     
    GROUP BY T1.AnneeSoutirage, T1.MoisSoutirage
    ORDER BY T1.AnneeSoutirage, T1.MoisSoutirage
    Effectivement, en renommant les colonnes de la table T1, cela fonctionne. Je ne l'oublierai pas à l'avenir ...

    En version complète et pour répondre à mon problème de départ cela donne :
    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
    SELECT COUNT(T1.EAN11), T1.ANNEE, T1.MOIS
     
    FROM 	(SELECT DISTINCT LEFT(ls.code_ean,11) AS EAN11,
    		YEAR(ls.date_soutirage) AS ANNEE,
    		MONTH(ls.date_soutirage) AS MOIS
     
    	FROM `yti`lot_soutirages ls
     
    	GROUP BY LEFT(ls.code_ean,11),
    		YEAR(ls.date_soutirage),
    		MONTH(ls.date_soutirage) ) AS T1
     
    WHERE T1.ANNEE>=2008
    GROUP BY T1.ANNEE, T1.MOIS
    ORDER BY T1.ANNEE, T1.MOIS
    Cela fonctionne impeccablement. Un grand merci à tous.

    Prochaine étape : le nombre de références soutirées sur les 18 derniers mois, chaque mois depuis janvier 2008.

    Fredche.

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

Discussions similaires

  1. [MFC] [API mySQL] Sous requêtes
    Par Guybrush113 dans le forum MFC
    Réponses: 5
    Dernier message: 29/04/2004, 16h14
  2. Problème DBExpress et sous requêtes ???
    Par Trulane dans le forum Bases de données
    Réponses: 5
    Dernier message: 26/03/2004, 14h40
  3. Requêtes et sous requêtes
    Par lau2nyce dans le forum Langage SQL
    Réponses: 3
    Dernier message: 23/03/2004, 15h14
  4. suppression avec sous requête conditionnelle
    Par melmel dans le forum Requêtes
    Réponses: 8
    Dernier message: 18/03/2004, 23h20
  5. Réponses: 3
    Dernier message: 18/05/2003, 00h16

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