Précédent   Forum des professionnels en informatique > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 06/07/2011, 10h55   #1
Membre du Club
 
Homme
Inscription : janvier 2008
Messages : 261
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Indre et Loire (Centre)

Informations forums :
Inscription : janvier 2008
Messages : 261
Points : 40
Points : 40
Par défaut Requête sur une table

Bonjour à tous,

Je me pose la question sur une manière différente de faire un requête.
J'ai une table avec les champs : ID, ID_Dossier,DateOuverure,DateCloture

Je souhaite compter le nombre de dossier encore ouverts (avec date de clôture à 0)

Par exemple :

1;D1;2011-01-01;0000-00-00
2;D2;2011-01-01;0000-00-00
3;D1;2011-01-01;2000-00-00
4;D3;2011-01-01;2011-01-01


Le nombre de dossier encore ouverts serait à 0.
J'ai fait cette requête :

Code :
1
2
3
4
5
6
7
8
9
10
11
 
SELECT 
d.ID_Dossier 
MAX(d.`DateCloture`) AS Date, 
MAX(d.ID) AS ID
 
FROM Dossier d
 
GROUP BY d.ID_Dossier
HAVING (Date)='000-00-00 00:00:00'
ORDER BY `Date` ASC
Je ne sais pas si je peux faire différemment pour utiliser un COUNT par exemple ?

Merci d'avance de votre aide.
dam28800 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/07/2011, 11h26   #2
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 638
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 638
Points : 2 630
Points : 2 630
Bonjour,

Si vous ne voulez connaitre que le nombre de dossier encore ouverts, dans ce cas une requête de ce genre devrait fonctionner :

Code :
1
2
3
4
5
6
7
 
SELECT count(*) AS cnt_dossier_ouvert
FROM Dossier d
WHERE d.DateCloture = '000-00-00 00:00:00' 
AND NOT EXISTS (SELECT 1 FROM Dossier d2 
                         WHERE d2.ID_Dossier = d.ID_Dossier AND 
                         d2.DateCloture > '000-00-00 00:00:00')
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/07/2011, 11h32   #3
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 431
Points : 10 431
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Je ne comprends pas votre exemple :
Citation:
Le nombre de dossier encore ouverts serait à 0.
D1 et D3 sont clos, mais pas D2.
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/07/2011, 11h36   #4
Membre du Club
 
Homme
Inscription : janvier 2008
Messages : 261
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Indre et Loire (Centre)

Informations forums :
Inscription : janvier 2008
Messages : 261
Points : 40
Points : 40
Merci de vos réponses.

Dans mon exemple seul D3 est clos car une date de clôture est renseigné.
D1 a subit une mise à jour mais n'est pas clos.

Le résultat doit donc être de deux (D1 et D2)

J'ai essayé la requête de punkoff mais les temps de traitement est très long et les résultats ne me semble pas correct (j'en ai beaucoup moins normalement)

Merci d'avance.
dam28800 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/07/2011, 11h39   #5
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 431
Points : 10 431
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Ok, c'est plus clair.

Une remarque, pourquoi utiliser la valeur '0000-00-00' en lieu et place de null tout simplement ?

Encore une question, voulez-vous la liste des dossiers encore ouverts ou juste leur nombre ?
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/07/2011, 11h40   #6
Membre du Club
 
Homme
Inscription : janvier 2008
Messages : 261
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Indre et Loire (Centre)

Informations forums :
Inscription : janvier 2008
Messages : 261
Points : 40
Points : 40
En fait je veux la liste et leur nombre.
Après à partir du nombre j'ai un autre besoin mais j'y arriverai peut être... à voir.

Pour le 000-00-00, je ne suis pas mettre des données, elles sont importées depuis un xml tout les soirs...

Merci
dam28800 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/07/2011, 11h55   #7
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 431
Points : 10 431
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Ça me paraît trop simple pour répondre à votre besoin :
Code :
1
2
3
SELECT DISTINCT d.ID_Dossier
  FROM Dossier
 WHERE DateCloture = '000-00-00 00:00:00'
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/07/2011, 12h02   #8
Membre du Club
 
Homme
Inscription : janvier 2008
Messages : 261
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Indre et Loire (Centre)

Informations forums :
Inscription : janvier 2008
Messages : 261
Points : 40
Points : 40
Effectivement je ne pense pas que cela marche car votre requête compte dans les résultats la ligne n°1 (dossier D1 ou la date de clôture est à 0), ce qui est normal mais si je rajoute une ligne avec une date de clôture pour D1 elle le compte aussi.
dam28800 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/07/2011, 12h06   #9
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 431
Points : 10 431
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Vous venez de me dire :
Citation:
1;D1;2011-01-01;0000-00-00
2;D2;2011-01-01;0000-00-00
3;D1;2011-01-01;2000-00-00
4;D3;2011-01-01;2011-01-01
Dans mon exemple seul D3 est clos car une date de clôture est renseigné.
D1 a subit une mise à jour mais n'est pas clos.
Merci d'être cohérent entre votre exemple et votre besoin.
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/07/2011, 12h09   #10
Membre du Club
 
Homme
Inscription : janvier 2008
Messages : 261
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Indre et Loire (Centre)

Informations forums :
Inscription : janvier 2008
Messages : 261
Points : 40
Points : 40
Citation:
1;D1;2011-01-01;0000-00-00
2;D2;2011-01-01;0000-00-00
3;D1;2011-01-01;2000-00-00
4;D3;2011-01-01;2011-01-01
Ci-dessus seul le dossier D3 est clos.

Citation:
1;D1;2011-01-01;0000-00-00
2;D2;2011-01-01;0000-00-00
3;D1;2011-01-01;2000-00-00
4;D3;2011-01-01;2011-01-01
5;D1;2011-01-01;2011-01-02
Ci-dessus le dossier D3 et D1 sont clos.
Avec votre requête j'ai 2 résultats alors que je ne devrais en avoir qu'un (dossier D2)

Je ne sais pas si c'est plus clair ?

Merci
dam28800 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/07/2011, 13h29   #11
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 638
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 638
Points : 2 630
Points : 2 630
dans votre exemple :
Code :
1
2
 
3;D1;2011-01-01;2000-00-00
la colonne DateCloture est à 2000-00-00, est-ce une faute de frappe ou non ?

Quel est le type de votre champs DateCloture ? un varchar / string ?
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/07/2011, 13h31   #12
Membre du Club
 
Homme
Inscription : janvier 2008
Messages : 261
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Indre et Loire (Centre)

Informations forums :
Inscription : janvier 2008
Messages : 261
Points : 40
Points : 40
Oui c'est une faute de frappe... j'enlève mes gants promis !
Le champ est de type datetime.

Merci
dam28800 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/07/2011, 13h44   #13
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 638
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 638
Points : 2 630
Points : 2 630
Personnellement je ne vois pas comment faire en une seule requête ce que vous demandez.

A moins, bien-sur, de le faire avec 2 requêtes imbriquées, dont une dans le select.

Donc je resterai sur ma proposition initiale qui doit fonctionner, il suffit juste de formater correctement le '0000-00-00 00:00:00' pour que votre SGBD le traduise bien.

Il faudra aussi utiliser un distinct dans le select afin de dégager les doublons sur l'ID_DOSSIER, ou d’utiliser un group by si vous souhaitez avoir l'ID max pour un ID_dossier.


edit: je viens de voir votre problème du poste #4 :
Avez vous un index du type :
Code :
1
2
 
CREATE INDEX idx_test ON dossier (DateCloture, ID_DOSSIER)
Concernant le nombre différent de ce que vous attendiez, c'est à cause des doublons que vous n'aviez pas mentionné au départ => distinct dans le count.

edit 2: la requête de Waldar est beaucoup mieux.
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/07/2011, 14h11   #14
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 431
Points : 10 431
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Essayez alors celle-ci :
Code :
1
2
3
4
  SELECT ID_Dossier
    FROM Dossier
GROUP BY ID_Dossier
  HAVING MAX(DateCloture) = '0000-00-00 00:00:00'
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 06/07/2011, 14h34   #15
Membre du Club
 
Homme
Inscription : janvier 2008
Messages : 261
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Indre et Loire (Centre)

Informations forums :
Inscription : janvier 2008
Messages : 261
Points : 40
Points : 40
Merci Waldar ça à l'air de fonctionner.


Par contre j'ai adapté la requête :

Code :
1
2
3
4
5
6
7
8
9
10
 
SELECT d.`reference`, a.action_equipe
FROM dossier d
 
LEFT JOIN dossier_action a
ON d.reference=a.reference
AND a.action_id=(SELECT MAX(action_id) FROM dossier_action WHERE reference=d.reference)
GROUP BY d.reference
 
HAVING MAX(d.`date_cloture`) = '0000-00-00 00:00:00'
En fait pour tout les dossier non clos je fais une jointure sur les actions du dossier pour récupérer la dernière action, et plus précisément le champ équipe.

Quand j'execute la requête j'obtiens bien ce que je veux en revanche j'aimerais faire un count pour chaque équipe (j'ai essayé le group by sur a.action_equipe mais non...)

Merci
dam28800 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/07/2011, 15h37   #16
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 008
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 008
Points : 18 279
Points : 18 279
Envoyer un message via MSN à CinePhil
Encore MySQL qui laisse faire des bêtises !

Toutes les colonnes du SELECT ne faisant pas l'objet d'une fonction de regroupement (MAX, MIN, COUNT, AVG) doivent figurer dans le GROUP BY ! Un SGBDR digne de ce nom aurait renvoyé une erreur avec votre requête !
À cause de ce piège MySQLesque, la valeur de a.action_equipe retournée par MySQL est aléatoire !

Reprenons du début...

1) Quels sont les dossiers non clos ?
La requête de Waldar, devrait le dire :
Citation:
Envoyé par Waldar
Code :
1
2
3
4
  SELECT ID_Dossier
    FROM Dossier
GROUP BY ID_Dossier
  HAVING MAX(DateCloture) = '0000-00-00 00:00:00'
2) Quelle équipe est concernée par ces dossiers non clos ?
Il suffit de faire une jointure de la requête précédente avec la table des actions :
Code :
1
2
3
4
5
6
7
8
9
SELECT tmp.reference, a.action_equipe
FROM dossier_action a
INNER JOIN
(
	SELECT reference
	FROM Dossier
	GROUP BY reference
	HAVING MAX(DateCloture) = '0000-00-00 00:00:00'
) tmp ON tmp.reference = a.reference
Pourquoi la condition de jointure se fait-elle sur la référence et non pas sur l'identifiant ?
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 03h23.


 
 
 
 
Partenaires

Hébergement Web