Clause Distinct sous Access

Clause Distinct sous Access - SQL/NoSQL - Programmation

Marsh Posté le 18-03-2011 à 10:49:47    

Bonjour à tous,
J'ai récupéré une base de données en désordre et je bute actuellement sur une requète sql, par rapport à l'option DISTINCT ON.
Dans la base ma table ressemble à ça :
 
IdObjet            | TechRubrique   |  Valeur
1256                | 172                | 2003/05/21
1256                | 121                | POSTE12
1256                | 192                | Durand
1256                | 240                | HP
1357                | 172                | 2005/06/03
1357                | 121                | POSTE13
1357                | 192                | MARTIN
... Et ainsi de suite.
 
J'aimerais récupérer uniquement récupérer pour tous les postes le numéro de poste (IdObjet), le nom de poste (POSTE12) et la date de mise en service de ce poste. Voici le résultat que je voudrais avoir :
 
IdObjet            |  Valeur
1256               | 2003/05/21
                     | POSTE12
1357               | 2005/06/03
                      | POSTE13
 
La requète que j'utilise est la suivante :
 
SELECT DISTINCT ON (dbo_Materiel.IdObjet) dbo_Materiel.IdObjet, dbo_Materiel.Valeur
FROM dbo_Materiel
WHERE dbo_Materiel.TechRubrique Like '172'  
OR dbo_Materiel.TechRubrique Like '121'
ORDER BY dbo_Materiel.IdObjet, dbo_Materiel.Valeur;
 
Lorsque je veux l'exécuter ou l'enregistrer, access me renvoie ce message :
"Erreur de syntaxe (opérateur absent) dans l'expression 'ON  (dbo_Materiel.IdObjet) dbo_Materiel.IdObjet'.
 
Malgré quelques heures passées sur la toile à chercher des infos sur le DISTINCT ON, je n'ai rien trouvé qui puisse faire fonctionner correctement ma requète, je fais donc appel à vous pour une petit coup de main ;)

Reply

Marsh Posté le 18-03-2011 à 10:49:47   

Reply

Marsh Posté le 18-03-2011 à 13:06:28    

Ce sujet a été déplacé de la catégorie Systèmes & Réseaux Pro vers la categorie Programmation par Je@nb

Reply

Marsh Posté le 18-03-2011 à 15:50:15    

Personne?

Reply

Marsh Posté le 18-03-2011 à 16:22:18    

Salut,
 
Je connais pas access, mais j'ai l'impression que ce que tu veux faire n'a pas trop de "sens" vu du coté SQL. En gros, est-ce que ca ne serait pas plus pratique pour toi d'avoir 3 colonnes dans ton résultat: IdObjet, NomPoste, DateMiseEnService?
 
Sinon, ca te donne quoi le résultat de ca, sans le distinct on?

SELECT dbo_Materiel.IdObjet, dbo_Materiel.Valeur
FROM dbo_Materiel
WHERE dbo_Materiel.TechRubrique Like '172'  
OR dbo_Materiel.TechRubrique Like '121'
ORDER BY dbo_Materiel.IdObjet, dbo_Materiel.TechRubrique desc;


De tete comme ca, ca devrait te donner ca (pour reprendre ton exemple):
IdObjet           |  Valeur
1256               | 2003/05/21
1256               | POSTE12
1357               | 2005/06/03
1357               | POSTE13  
Ca te va pas?


---------------
C'était vraiment très intéressant.
Reply

Marsh Posté le 18-03-2011 à 16:41:15    

Il est vrai que l'affichage n'est pas ce qu'il y a de mieux, de mon point de vue aussi... Mais étant en contrat pro dans une grosse boîte, et pour diverses raisons, je suis obligé de travailler sur cette base de données, qui, pour moi, est plus une usine à gaz qu'autre chose, et je n'ai d'autre choix que de continuer en ce sens, malgré le fait d'en avoir parlé à mon tuteur.
Bref, l'affichage qu'on souhaiterai récupérer c'est que pour chaque numéro de poste, on veut avoir à la fois le nom du poste et la date de mise en service (qui hélas ne pourront être affichés uniquement sur deux colonnes plutôt que trois), comme ceci :
IdObjet            |  Valeur
1256               | 2003/05/21
                     | POSTE12
1357               | 2005/06/03
                      | POSTE13  
 
Pour obtenir le résultat souhaité, j'aurais voulu le faire par requête SQL, car à mon niveau c'est ce qui me paraissait le plus simple, plutôt que de créer un exécutable en vbs attaquant la BDD mysql en liaison ODBC (de la même manière qu'Access), exécutable qui renverrait tout dans un fichier texte avec un format d'affichage en 3 colonnes...
 
Sans le DISTINCT ON, j'ai en gros, grâce à cette commande le résultat suivant :
SELECT dbo_Materiel.IdObjet, dbo_Materiel.Valeur
FROM dbo_Materiel
WHERE dbo_Materiel.TechRubrique Like '172'  
OR dbo_Materiel.TechRubrique Like '121'
GROUP BY dbo_Materiel.IdObjet, dbo_Materiel.Valeur;
 
Donc en gros le même résultat que tu me proposais :
 
IdObjet           |  Valeur
1256               | 2003/05/21
1256               | POSTE12
1357               | 2005/06/03
1357               | POSTE13  
 
Pour ma part, je me serais limité à ce résultat mais, mon tuteur, à nouveau, veut pour plus de clarté qu'on supprime les doublons de la colonne IdObjet, de cette manière :
 
IdObjet            |  Valeur
1256               | 2003/05/21
                     | POSTE12
1357               | 2005/06/03
                      | POSTE13  
 
Quelle solution serait la meilleure à adopter? Avec le Distinct ON je galère vu que je respecte la syntaxe affichée sur un des rares sites qui parle de cette option (avec le ON), et que malgré tout la commande ne passe pas, et je n'en trouve pas la cause du problème.

Reply

Marsh Posté le 18-03-2011 à 17:00:29    

Ben si c'est que pour l'affichage, il doit surement y avoir moyen de partir de la requete que je t'ai donnée (qui affiche "deux fois" IdObjet) et de "cacher" IdObject sur certaines lignes.
Je connais pas la syntaxe Access, en SQL Oracle ca donnerait un truc du genre, à toi d'adapter (j'sais pas si ya un CASE en access, p'tetre avec des IF?)

SELECT CASE WHEN dbo_Materiel.TechRubrique Like '172' THEN dbo_Materiel.IdObjet ELSE null END as IdObjet, dbo_Materiel.Valeur
FROM dbo_Materiel
WHERE dbo_Materiel.TechRubrique Like '172'  
OR dbo_Materiel.TechRubrique Like '121'
ORDER BY dbo_Materiel.IdObjet, dbo_Materiel.TechRubrique desc;


En gros, tu n'affiches l'ID que si la TechRubrique vaut 172, sinon t'affiches du vide.


---------------
C'était vraiment très intéressant.
Reply

Marsh Posté le 24-03-2011 à 09:49:39    

J'ai essayé ta commande mais ce la ne fonctionne pas... J'ai aussi trouvé d'autres infos sur ce site http://sqlpro.developpez.com/cours/sqlaz/select/ et testé cette commande ci mais elle ne fonctionne pas non plus :
SELECT dbo_Materiel.IdObjet, CASE dbo_Materiel.TechRubrique WHEN '172' THEN dbo_TechDonnees.IdObjet LIKE null END as dbo_TechDonnees.IdObjet
FROM dbo_Materiel
WHERE dbo_Materiel.TechRubrique Like '172'  
OR dbo_Materiel.TechRubrique Like '121'  
GROUP BY dbo_Materiel.IdObjet, dbo_Materiel.Valeur;
 
Des solutions?

Reply

Marsh Posté le 24-03-2011 à 09:52:48    

Au fait, erreur rencontrée avec les deux commandes :  opérateur absent sur l'expression CASE WHEN...

Reply

Marsh Posté le 25-03-2011 à 15:40:55    

personne?

Reply

Marsh Posté le 28-04-2011 à 15:14:40    

Toujours personne?

Reply

Marsh Posté le 28-04-2011 à 15:14:40   

Reply

Marsh Posté le 28-04-2011 à 17:24:07    

1/ C'est DISTINCT et pas DISTINCT ON (je sais pas où tu es allé chercher le ON...)
2/ CASE WHEN n'existe pas sous Access


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Sujets relatifs:

Leave a Replay

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