Problème Requete SQL

Problème Requete SQL - SQL/NoSQL - Programmation

Marsh Posté le 15-02-2008 à 12:36:27    

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!

Reply

Marsh Posté le 15-02-2008 à 12:36:27   

Reply

Marsh Posté le 15-02-2008 à 13:16:19    

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

Reply

Marsh Posté le 15-02-2008 à 13:55:15    

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

Reply

Marsh Posté le 15-02-2008 à 14:25:29    

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.
Reply

Marsh Posté le 15-02-2008 à 14:46:43    

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?
 
 
 

Reply

Marsh Posté le 18-02-2008 à 16:45:22    

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

Reply

Marsh Posté le 18-02-2008 à 16:45:45    

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);

Reply

Marsh Posté le 18-02-2008 à 16:46:01    

(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
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed