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 MySQL Discussion :

Select et group by date en affichat les dates absentes


Sujet :

Requêtes MySQL

  1. #1
    Membre chevronné
    Avatar de DelphiCool
    Homme Profil pro
    Ingénieur de production
    Inscrit en
    Mars 2002
    Messages
    187
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur de production
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2002
    Messages : 187
    Points : 2 198
    Points
    2 198
    Par défaut Select et group by date en affichat les dates absentes
    Bonjour,

    j'ai une table
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CREATE TABLE lesdates 
    (
    id integer auto_increment ,
    ladate date not null, 
    nb integer , 
    primary key (id)
    );

    avec les datas suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    INSERT INTO lesdates (ladate,nb) 
    values 
    ('2013-05-01',2),
    ('2013-05-04',4),
    ('2013-05-05',13),
    ('2013-05-10',9);

    Je fait cette requêtes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT * 
    FROM lesdates 
    WHERE ladate between '2013-05-01' AND '2013-05-10' 
    GROUP BY ladate;
    j'obtiens le résultat suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    +----+------------+------+
    | id | ladate     | nb   |
    +----+------------+------+
    |  1 | 2013-05-01 |    2 |
    |  2 | 2013-05-04 |    4 |
    |  3 | 2013-05-05 |   13 |
    |  4 | 2013-05-10 |    9 |
    +----+------------+------+
    avec des trous de dates car les dates n'existent pas.

    Je voudrais savoir comment faire une requête avec un truc du style "INTERVAL 1 DAY" qui me sortirait toutes les dates, tout les 1 jours pour obtenir un résultat du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    +----+------------+------+
    | id | ladate     | nb   |
    +----+------------+------+
    |  1 | 2013-05-01 |    2 |
    |  null | 2013-05-02 |    null |
    |  null | 2013-05-03 |    null |
    |  2 | 2013-05-04 |    4 |
    |  3 | 2013-05-05 |   13 |
    |  null | 2013-05-06 |    null |
    |  null | 2013-05-07 |    null |
    |  null | 2013-05-08 |    null |
    |  null | 2013-05-09 |    null |
    |  4 | 2013-05-10 |    9 |
    +----+------------+------+

  2. #2
    Membre expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Points : 3 295
    Points
    3 295
    Billets dans le blog
    1
    Par défaut
    salut,

    oui l'idée est de te faire une table calendrier, au pas voulu (temporaire et sur mesure, le mieux, dans une procédure stockée, ou en faisant une table sur une très longue période, plus simple mais moins efficace et plus lourd)

    tu n'as plus qu'à faire un left join (sur ta tables de données et en mettant la table calendrier dans le from) et mettre ton between dans le where (en l'adaptant bien sur)...

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT c.ladate,l.id,l.nb
    FROM calendrier c
    left join lesdates l on l.ladate=c.ladate
    WHERE c.ladate BETWEEN '2013-05-01' AND '2013-05-10'

    avec:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CREATE TABLE calendrier
    (
    id integer AUTO_INCREMENT ,
    ladate date NOT NULL, 
    PRIMARY KEY (id)
    );

  3. #3
    Membre chevronné
    Avatar de DelphiCool
    Homme Profil pro
    Ingénieur de production
    Inscrit en
    Mars 2002
    Messages
    187
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur de production
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2002
    Messages : 187
    Points : 2 198
    Points
    2 198
    Par défaut
    salut,

    Je comprend ta méthode, que j'ai déjà vu.

    Cela veux dire que sans une table contenant mes dates je ne vais pas pouvoir faire ce que je souhaite ?

  4. #4
    Membre expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Points : 3 295
    Points
    3 295
    Billets dans le blog
    1
    Par défaut
    en une seule passe non...

    perso je le fais en procédural et je génère cette table dynamiquement... je trouve pas très utile de se fader une table sur 10 ou 30ans par exemple...
    et comme ça tu peux modifier le range et le pas si tu le prévois dans ta procédure...

  5. #5
    Membre averti
    Profil pro
    Administrateur
    Inscrit en
    Mai 2008
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Administrateur
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2008
    Messages : 237
    Points : 433
    Points
    433
    Par défaut
    Citation Envoyé par DelphiCool Voir le message
    salut,

    Je comprend ta méthode, que j'ai déjà vu.

    Cela veux dire que sans une table contenant mes dates je ne vais pas pouvoir faire ce que je souhaite ?
    Pourquoi ne pas le gérer directement à l'affichage dans une boucle avec php.
    En parcourant un tableau de dates généré dynamiquement.
    Si la date n'est pas dans la liste des résultats retournés par la requête, on affiche autre chose.

  6. #6
    Membre expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Points : 3 295
    Points
    3 295
    Billets dans le blog
    1
    Par défaut
    sous réserve qu'il soit avec php...

    mais après oui c'est que de l'affichage, vu qu'on est plutôt en pur mysql ici, c'est pour ça que je ne proposais que ça...

  7. #7
    Membre chevronné
    Avatar de DelphiCool
    Homme Profil pro
    Ingénieur de production
    Inscrit en
    Mars 2002
    Messages
    187
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur de production
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2002
    Messages : 187
    Points : 2 198
    Points
    2 198
    Par défaut
    Je ne suis pas en php.

    C'est un reporting que je fait avec Birt sur une base en read only.
    Donc je ne peux pas créé de table temporaire.

    Je vais creuser du coté birt pour voir si je peux faire cela.

    Merci pour vos réponses

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 01/08/2011, 13h40
  2. Réponses: 7
    Dernier message: 03/09/2009, 15h27
  3. obtenir toutes les dates valides comprises entre dates
    Par captainamerica75 dans le forum VBA Access
    Réponses: 3
    Dernier message: 01/06/2006, 14h25
  4. [Dates] Calcul sur les dates...
    Par gawelldanor dans le forum Langage
    Réponses: 10
    Dernier message: 04/04/2006, 12h07
  5. [Dates] souci avec les dates
    Par Ludo75 dans le forum Langage
    Réponses: 3
    Dernier message: 22/02/2006, 18h15

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