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

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Problème Requete SQL

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Problème Requete SQL

n°1686830
OhAime971
J'aime pas le C !
Posté le 15-02-2008 à 12:36:27  profilanswer
 

Bonjour à tous!
 
Voilà en fait j'ai cette requête SQL:
 

Code :
  1. SELECT COUNT( gi_intervention.id ) AS nbr_inter, gi_intervention.date AS date, gi_categories.nom
  2. FROM gi_categories
  3. RIGHT JOIN gi_intervention ON ( gi_categories.id = gi_intervention.id_categorie )
  4. WHERE (
  5. (
  6. gi_intervention.date >= '2008-02-01'
  7. )
  8. AND (
  9. gi_intervention.date <= '2008-02-08'
  10. )
  11. )
  12. GROUP BY gi_categories.id, gi_intervention.date


 
 
Mon problème est que le résultat de cette requête ne m'affiche que les catégories pour lesquelles une intervention existe à la date. Ce que je voudrais c'est pouvoir afficher toutes les catégories pour chacune des dates présentes, et si le résultat du COUNT est nul, alors il m'affiche Null.
 
J'ai essayer de la tourner dans tous les sens, mais là, je ne sais vraiment plus quoi faire. Si quelqu'un à une idée.
 
Merci!

mood
Publicité
Posté le 15-02-2008 à 12:36:27  profilanswer
 

n°1686870
yellu
Posté le 15-02-2008 à 13:16:19  profilanswer
 

Bonjour,
 
Essai quelque chose dans ce genre là :
 
SELECT gi_categories.nom, gi_intervention.date, COUNT(*)
FROM gi_categories
LEFT JOIN gi_intervention ON gi_categories.id = gi_intervention.id_categorie AND gi_intervention.date BEWEEN '2008-02-01' AND '2008-02-08'
GROUP BY gi_categories.nom, gi_intervention.date

n°1686898
OhAime971
J'aime pas le C !
Posté le 15-02-2008 à 13:55:15  profilanswer
 

Eh bien, ça fonctionne bien si on ne sélectionne qu'un seul jour :/ Dès qu'il y a plusieurs jours dans la sélection, il ne selectionne que les catégories pour lesquels il y a bien une intervention dans la plage de date.
Je sèche completement là!
 
Pour info je suis sur MySQL

n°1686912
anapajari
s/travail/glanding on hfr/gs;
Posté le 15-02-2008 à 14:25:29  profilanswer
 

si tu mets des conditions sur ta table "optionnelle", tu transformes ta jointure interne en jointure externe.
Voir là: http://forum.hardware.fr/hfr/Progr [...] 1691_1.htm ( marre de toujours refaire la même explication ) :o


---------------
Software and cathedrals are much the same - first we build them, then we pray.
n°1686930
OhAime971
J'aime pas le C !
Posté le 15-02-2008 à 14:46:43  profilanswer
 

Merci pour cette explication, cependant, lorsque j'execute la requête, il va effectivement me récupérer toutes les catégories, mais une seule fois pour toute la requête. Ce que je voudrais, c'est que pour chaque date pour laquelle il existe au moins une intervention, j'ai toutes les catégories affichés pour cette date.
 

Code :
  1. SELECT COUNT( gi_intervention.id ) AS nbr_inter, gi_intervention.date AS date, gi_categories.nom
  2. FROM gi_categories
  3. LEFT JOIN gi_intervention ON ( gi_categories.id = gi_intervention.id_categorie
  4. AND gi_intervention.date >= '2008-02-08' )
  5. GROUP BY gi_intervention.date, gi_categories.id


 
 
Je me demande si c'est vraiment possible en SQL. Est-ce que la solution ne serait pas de faire une requête pour chaque jour de ma plage?
 
 
 

n°1687962
MagicBuzz
Posté le 18-02-2008 à 16:45:22  profilanswer
 

A vérifier :

Code :
  1. SELECT c.nom, i.date, sum(case when i.cat_id = c.id then 1 else 0 end)
  2. FROM gi_intervention i
  3. CROSS JOIN gi_categorie c
  4. WHERE i.date >= '2008-02-01'
  5. GROUP BY i.date, c.nom
  6. ORDER BY i.date

n°1687963
MagicBuzz
Posté le 18-02-2008 à 16:45:45  profilanswer
 

Ca marche sous SQL Server 2005 avec ce jeu de test :

Code :
  1. CREATE TABLE gi_categorie (id integer NOT NULL PRIMARY KEY, nom varchar(50) NOT NULL)
  2. go
  3. CREATE TABLE gi_intervention (id integer NOT NULL PRIMARY KEY, date datetime NOT NULL, cat_id integer NOT NULL REFERENCES gi_categorie(id))
  4. go
  5.  
  6. INSERT INTO gi_categorie (id, nom) VALUES (1, 'Cat 1');
  7. INSERT INTO gi_categorie (id, nom) VALUES (2, 'Cat 2');
  8. INSERT INTO gi_categorie (id, nom) VALUES (3, 'Cat 3');
  9.  
  10. INSERT INTO gi_intervention (id, date, cat_id) VALUES (1, '2008-01-01', 1);
  11. INSERT INTO gi_intervention (id, date, cat_id) VALUES (2, '2008-01-02', 2);
  12. INSERT INTO gi_intervention (id, date, cat_id) VALUES (3, '2008-02-02', 3);
  13. INSERT INTO gi_intervention (id, date, cat_id) VALUES (4, '2008-02-02', 1);
  14. INSERT INTO gi_intervention (id, date, cat_id) VALUES (5, '2008-02-02', 1);
  15. INSERT INTO gi_intervention (id, date, cat_id) VALUES (6, '2008-02-10', 2);
  16. INSERT INTO gi_intervention (id, date, cat_id) VALUES (7, '2008-02-11', 3);
  17. INSERT INTO gi_intervention (id, date, cat_id) VALUES (8, '2008-02-11', 2);

n°1687964
MagicBuzz
Posté le 18-02-2008 à 16:46:01  profilanswer
 

(ps : mais c'est tout pourri hein :o)
 
Il s'agit ici de faire un produit cartésien (comme ça, on récupère bien tous les tuples des deux tables), et de compter les lignes qui respectent la jointure.


Message édité par MagicBuzz le 18-02-2008 à 16:48:02

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

  Problème Requete SQL

 

Sujets relatifs
[SQL Serveur] probleme requete avec calcul (tout bete)Probleme de requête SQL
[RESOLU] - Probleme requete SQL - RETURN[SQL] Problème avec une petite requête et un DISTINCT.
[SQL 2005] Problème pour une requête SELECTProblème requete SQL sur du PHP
Problème de requête SQL - PHP - mysql[SQL/Access] problème pour une requête en apparence assez simple
Probleme de création de requête SQL un peu compliqué !Problème de type dans une requête SQL
Plus de sujets relatifs à : Problème Requete SQL


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