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

Langage SQL Discussion :

Comment faire une agrégation à la semaine en SQL ?


Sujet :

Langage SQL

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 15
    Points : 6
    Points
    6
    Par défaut Comment faire une agrégation à la semaine en SQL ?
    Bonjour,

    Mon problème est le suivant : J'ai une table avec environ 10 millions d'entrées. Ces entrées sont simples, J'ai comme colonne référence, date et quantité. La référence correspond à la référence d'un produit, la quantité vendu et la date ou cette quantité est vendu . J'ai donc pour chaque produit une quantité par jour de vente.

    Je ne sais pas si c'est directement possible en SQL mais je souhaiterais faire une agrégation à la semaine ou si vous préférez, Regrouper les valeurs des 7 champs quantite d'une semaine en 1.

    Par exemple disons que j'ai ces données :

    00144401;2007-08-27 00:00:00;36
    00144401;2007-08-28 00:00:00;12
    00144401;2007-08-29 00:00:00;33
    00144401;2007-08-30 00:00:00;31
    00144401;2007-08-01 00:00:00;12
    00144401;2007-08-02 00:00:00;3
    00144402;2007-08-27 00:00:00;30
    00144402;2007-08-28 00:00:00;10
    00144402;2007-08-29 00:00:00;30
    00144402;2007-08-30 00:00:00;30
    00144402;2007-08-01 00:00:00;10
    00144402;2007-08-02 00:00:00;10

    J'aimerais que le serveur me retourne :
    00144401;1;127
    00144402;1;120

    Le 1 représenterai par exemple la première semaine et la dernière valeur la quantité vendu en 1 semaine.

    SI quelqu'un a une idée ... sinon dans le pire des cas je devrais le faire dans mon code java mais le SQL est quand même puissant et cela me ferai gagner du temps de lui laisser le travail !

    Merci d'avance.

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    500
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 500
    Points : 639
    Points
    639
    Par défaut
    2 questions :
    - quel est ton SGBD ?
    - est-ce que ton numéro de semaine peut être arbitraire ou pas ?

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 15
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par dgi77 Voir le message
    2 questions :
    - quel est ton SGBD ?
    - est-ce que ton numéro de semaine peut être arbitraire ou pas ?
    SGBD : PostgreSQL


    Pour le numéro de semaine, c'est juste un index. Par exemple, si mon historique commence le lundi de la 2ème semaine d'AOUT, et bien se sera la semaine 1 etc ... On se base pour le compte à la date la plus ancienne ancienne jusque la plus récente.

  4. #4
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Salut !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT extract(year from tadate), extract(week from tadate), sum(qty)
    FROM TaTable
    GROUP BY extract(year from tadate), extract(week from tadate)
    Ca peut faire l'affaire ?

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 15
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par pacmann Voir le message
    Salut !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT extract(year from tadate), extract(week from tadate), sum(qty)
    FROM TaTable
    GROUP BY extract(year from tadate), extract(week from tadate)
    Ca peut faire l'affaire ?
    Je viens de tester et le problème est qu'il additionne tous les produits ! Alors que j'aurai besoin des informations que retourne ta requete mais pour chaque produit !

    En tous cas c'est un bon début , merci !

  6. #6
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Allez, je te laisse chercher, avec une toute petite indication :

    Ce qui permet de définir tes agrégats pour faire les sommes, c'est ce qu'il y a dans la clause : GROUP BY.

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 15
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par pacmann Voir le message
    Allez, je te laisse chercher, avec une toute petite indication :

    Ce qui permet de définir tes agrégats pour faire les sommes, c'est ce qu'il y a dans la clause : GROUP BY.
    Oui j'ai trouver ^^

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     SELECT extract(year FROM date), extract(week FROM date), sum(quantite),referance
    FROM historique
    GROUP BY extract(year FROM date), extract(week FROM date),referance
    C'est juste que des que je fait une requête cela mets 10 minute ^^

    En tous cas merci ! Je ne connaisser pas exract ! et J'imagine que si je veux agrégé au mois j'ai juste a changer extract(week FROM date) par extract(month FROM date) ?

    Encore merci pour les réponses rapides !

  8. #8
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Oui tout à fait.

    D'un point de vue performances, petite question :
    Quels sont tes indexes ?
    Si ta colonne Reference est indéxée, il y a peut être moyen que ça aille plus vite en mettant la Reference comme première colonne dans le GROUP BY...

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 15
    Points : 6
    Points
    6
    Par défaut
    Je suis encore dans une phase de test, j'ai pas encore définie ma structure entière ni les indexes ! Mais c'est que la, pour une table de 10 millions et lorsque je fait ma requête j'ai 1.4 milllion de réponses ca prend presque 10 minutes !

    Je testerais un indexes pour comparer les perf !

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 15
    Points : 6
    Points
    6
    Par défaut
    j'ai un dernier souci et au lieu de faire un nouveau message je préfère réouvrir celui-ci :à)

    Donc la requête précédente marche très bien mais le problème est par exemple si j'ai aucune informations pour disons la semaine 21 dans le cas d'une agrégation semaine, et bien la reqiuête passe de la semaine 20 à 22 direct ! Ce qui est logique mais serait-il possible d'ajouter une action dans ma requête pour que lorsque une semaine ou un mois ne contient aucune informations, on l'affiche quand même mais à 0 ?

    Merci d'avance !

  11. #11
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 108
    Points : 28 424
    Points
    28 424
    Par défaut
    En SQL, on ne peut afficher de données qui ne sont pas présentes dans la base.
    Il te faut donc une table calendrier.
    Lis à ce propos : Le temps, sa mesure, ses calculs
    Citation Envoyé par SQLPro
    La plupart des SGBDR sont incapables de fournir une réponse correcte aux problématique de calculs de temps. Voici une étude et une solution à tout vos maux temporels !

  12. #12
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 15
    Points : 6
    Points
    6
    Par défaut
    Malheureusement, je ne peux pas ajouter de nouvelles tables pour ce calendrier. C'est donc impossible ?

  13. #13
    Modérateur
    Avatar de Chtulus
    Homme Profil pro
    Ingénieur
    Inscrit en
    Avril 2008
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2008
    Messages : 3 094
    Points : 8 678
    Points
    8 678
    Par défaut
    Bonjour,

    Ce ne serait pas possible d'utiliser la fonction COALESCE qui, je crois, fonctionne sous PostGre.

Discussions similaires

  1. [SQL] Comment faire une procédure stockée
    Par PoichOU dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 28/05/2007, 21h58
  2. Comment faire une requête SQL dans un datatable
    Par Passepoil dans le forum VB.NET
    Réponses: 2
    Dernier message: 05/02/2007, 20h24
  3. Réponses: 23
    Dernier message: 19/09/2006, 11h33
  4. Réponses: 2
    Dernier message: 03/05/2004, 12h13

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