Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1619 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  [SQL] Requête groupée par jour et remplissage des jours inexistant

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[SQL] Requête groupée par jour et remplissage des jours inexistant

n°1417389
ceyquem
E falso sequitur quodlibet
Posté le 01-08-2006 à 13:26:03  profilanswer
 

Bonjour,
 
J'ai une table "table" dans laquelle j'ai un certain nombre d'enregistrements par jour (champ "date" ).
Il y a certains jours pour lequel il n'y a pas d'enregistrements correspondants. Exemple :
 
01.01.06 x
01.01.06 y
01.01.06 z
02.01.06 t
04.01.06 a
05.01.06 b
 
Si je fais une requête du style : SELECT `date`, count(*) AS total FROM `table` GROUP BY `date` j'obtiens :
 
01.01.06 2
02.01.06 1
04.01.06 1
05.01.06 1
...
 
Et là je constate que j'ai plein de trous aux dates pour lesquels il n'y a pas eu d'enregistrements.
Comment faire simplement une requête qui me renvoie tous les jours sans modifier la structure de ma table ?
Exemple de ce que je veux avoir :
 
01.01.06 2
02.01.06 1
04.01.06 0
04.01.06 1
05.01.06 1
...
 
Bonne journée :)

mood
Publicité
Posté le 01-08-2006 à 13:26:03  profilanswer
 

n°1417396
betsamee
Asterisk Zeperyl
Posté le 01-08-2006 à 13:31:59  profilanswer
 

a mon avis c 'est pas possible (mais je suis peux me tromper) a part en creant une autre table "jours" contenant tous les jours possibles et en faisant une requete du style

Code :
  1. select jours.jour,A.total
  2. from jours left join
  3. (
  4. SELECT `date`, count(*) AS total FROM `table` GROUP BY `date`
  5. )as A on jours.jour = A.date


Message édité par betsamee le 01-08-2006 à 13:32:49
n°1417409
anapajari
s/travail/glanding on hfr/gs;
Posté le 01-08-2006 à 13:49:04  profilanswer
 

Je suis d'accord pour la table "jours" ( tu as un exemple la mais pourquoi faire un sous-select???
Genre  

Code :
  1. select jours.date, count(*)
  2. from jours left join table on table.date = jours.date
  3. group by jours.date


 

n°1417414
betsamee
Asterisk Zeperyl
Posté le 01-08-2006 à 13:56:51  profilanswer
 

oui tu as raison le sous-select n est pas obligatoire
c'est un mauvais reflexe que j ai pris [:petrus75]

n°1417420
sircam
I Like Trains
Posté le 01-08-2006 à 14:03:21  profilanswer
 

:heink:
 
Et elle contient quoi, votre table "jours" ? Tous les jours possibles ? C'est inélégant et limitif, sans parler de l'impact possible sur les perfs.  C'est de la triche car ça ne peut marcher qu'avec des cas finis. C'est une technique peu généralisable.
 
Si on voulait ne serait-ce que rajouter les heures et les minutes et sélectionner un intervalle, ça serait insupportable.
 
Il vaut mieux accepter que ce traitement ne colle pas au SQL et coder un peu de logique par-dessus, ne serait-ce qu'avec une stored procedure.


Message édité par sircam le 01-08-2006 à 14:03:36

---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
n°1417441
betsamee
Asterisk Zeperyl
Posté le 01-08-2006 à 14:17:17  profilanswer
 

bah perso je cherchait pas a etre particulierement elegant mais a repondre en SQL a un probleme SQL [:spamafote]

n°1417487
sircam
I Like Trains
Posté le 01-08-2006 à 15:06:32  profilanswer
 

C'est certain que dans ce cas précis, il est possible d'y répondre en SQL, en faisant une pirouette.
 
Mais je ne pense pas que ce soit souhaitable. [:pingouino]


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
n°1417488
pains-aux-​raisins
Fatal error
Posté le 01-08-2006 à 15:07:08  profilanswer
 

sircam > ça se fait assez souvent ce genre de bidule, notamment dans les schémas de type décisionnel. La table de tous les jours (le calendrier) permet par exemple d'exploiter les index et au final d'améliorer les perfs par rapport à une stored procédure.
 
Effectivement, il faut que la problématique soit un cas discret. Pour son problème c'est le cas.

n°1417760
ceyquem
E falso sequitur quodlibet
Posté le 01-08-2006 à 22:15:43  profilanswer
 

En fait la solution de créer une table à côté ne me convient pas trop car je ne connais pas à l'avance les deux dates minimales et maximales de ma sélection.
Celles-ci peuvent être choisies par l'utilisateur (dates passées et dates futures).
N'est-il pas possible de créer en mémoire une sorte de table avec ces dates juste pour la requête SQL ? D'un point de vue taille mémoire, le nombre de jours ne dépasse pas 2 mois.

n°1417768
pains-aux-​raisins
Fatal error
Posté le 01-08-2006 à 22:35:59  profilanswer
 

ben, c'est simple, tu crées une table temporaire avec les jours de l'interval saisie par ton user

mood
Publicité
Posté le 01-08-2006 à 22:35:59  profilanswer
 

n°1419880
Arjuna
Aircraft Ident.: F-MBSD
Posté le 04-08-2006 à 16:55:45  profilanswer
 

sircam > à la base, c'est pas au SGBD de divaguer à propos de données qui n'existent pas.
donc ce que tu demandes, à moins de faire la pirouette stipulée, y'a pas moyen.
 
tu peux toujours passer par une PS qui va te générer un curseur allimenté en fonction d'une date de début, une date de fin, et qui rempli en fonction des nombres de jours par mois et tenant compte des années bisextilles, mais ça ne changera rien au schmilblick : c'est gore, et c'est pas au sgbd se s'en occuper.

n°1419888
sircam
I Like Trains
Posté le 04-08-2006 à 17:04:35  profilanswer
 

Arjuna> Mais c'est justement ce que je ne veux pas.
 
La stored proc, c'était à l'extrême limite si on n'a pas de couche par dessus, dans le cas où l'intervalle n'est pas assez discret (ou pas discret du tout).
 
Et inversément, créer une table avec des jours, si besoin au vol, dans le seul but que ça colle au DBMS, c'est assez tordu, alors que le traitement n'a clairement pas sa place au sein du DBMS.


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
n°1419897
Arjuna
Aircraft Ident.: F-MBSD
Posté le 04-08-2006 à 17:10:36  profilanswer
 

c'est bien ce que je te dis vin dieu :o
 
tu fais ton select avec tes jours qui existent uniquement.
 
et après, dans ton appli qui appelle la requête, tu t'occupes de boucher les trous. c'est pas au sgbd de le faire. ou alors tu viens pas te plaindre parceque c'est pas propre.

n°1419898
sircam
I Like Trains
Posté le 04-08-2006 à 17:11:40  profilanswer
 

Mais bourdel, c'est ce que je me tue à répéter. :o
 
http://forum.hardware.fr/hardwaref [...] m#t1417420


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  [SQL] Requête groupée par jour et remplissage des jours inexistant

 

Sujets relatifs
[Résolu] [C#] Mettre à jour une List à partir d'une autreProblème de contenu d'une variable suite à requete AJAX.
[SQL]Erreur requête imbriquée[Résolu]?? Simplification d'une requete ???
Inserser et lire fichier word dans base de donnees SQLrécupérer chaque jour des donées dans un nouveau fichier Excel
Probleme requete WMI interminableResultat requete popup
[vb6] difficulté à faire une requete sql 
Plus de sujets relatifs à : [SQL] Requête groupée par jour et remplissage des jours inexistant


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR