Forum |  HardWare.fr | News | Articles | PC | Prix | S'identifier | S'inscrire | Aide Recherche
2023 connectés 

 


 Mot :   Pseudo :  
 
 Page :   1  2
Page Suivante
Auteur Sujet :

[ASP][SQL] comment faire un SELECT DISTINCT en ayant plusieurs champs?

n°1906170
claudelana
Posté le 17-07-2009 à 14:43:22  profilanswer
 

Reprise du message précédent :
J'ai un problème de selection avec un distinct qui ne veut pas faire ce que je voudrais.
N'étant pas un virtuose de la BDD et après une recherche sur le net je suis arrivé sur ce poste qui ne date pas d'hier :) Donc, je me suis
permis de poster mon souci ici en espèrant que quelqu'un veuille bien m'aider.
 
J'ai une table produit dans une base de données access qui est composée des champs suivant :
Tout les champs ne sont pas représentés ici (trop nombreux)
 
Numéro, Code_Article, Désignation_Article, Code_Rayon, Désignation_Rayon, Code_Famille, Désignation_Famille, Code_S_Famille, Désignation_S_Famille, Code_Fournisseur, Nom_Fournisseur, Libelle_de_la_Taille, Code_Couleur, Désignation_Couleur, Code_Fabricant, Désignation_Fabricant, Prix_Vente_TTC
...., etc.
 
Je voudrais imprimer une étiquette générique par produit (sur cette étiquette doit figurer plusieurs champs)
 
Je prends par exemple parmit tous les produits de la table des chaussures qui ont les même données dans tous les champs sauf pour les champs taille et couleur ( ces deux champs ne figurent pas sur l'étiquette)
 
(extrait de la table produit)
 
Num CodeArt DésignArt  DésignRayon DésignFam DésignSFam NFour       Taille   DésignCoul DésignFabr     Prix
07   00153    Chauhiver  Chaussures  Chaussons Velcros        ANDREA     32       Noir          Andrea      115,00
08   00153    Chauhiver  Chaussures  Chaussons Velcros        ANDREA     32.5    Marron       Andrea      115,00
09   00153    Chauhiver  Chaussures  Chaussons Velcros        ANDREA     33       Vert          Andrea 115,00
10   00153    Chauhiver  Chaussures  Chaussons Velcros        ANDREA     33.5    Rouge        Andrea 115,00
11   00153    Chauhiver  Chaussures  Chaussons Velcros        ANDREA     34       Blanc         Andrea 115,00
37   00154    Chauhiver  Chaussures  Chaussons Enfants        ANDREA     26       Marron       Andrea  41,00
38   00154    Chauhiver  Chaussures  Chaussons Enfants       ANDREA     27       Vert          Andrea  41,00
48   00157    Chauhiver  Chaussures  Chaussons Lacets        ANDREA     32       Rouge         Andrea 108,00
49   00157    Chauhiver  Chaussures  Chaussons Lacets        ANDREA     32.5     Noir           Andrea 108,00
50   00157    Chauhiver  Chaussures  Chaussons Lacets        ANDREA     33        Noir           Andrea 108,00
78   00162    Chauhiver  Chaussures  Chaussons Velcros       BORÉAL      2 UK     Vert           Boréal  78,90
79   00162    Chauhiver  Chaussures  Chaussons Velcros       BORÉAL      2.5 UK  Vert           Boréal  78,90
80   00162    Chauhiver  Chaussures  Chaussons Velcros       BORÉAL      3 UK     Vert           Boréal  78,90
 
 
J'ai essayé ceci "SELECT DISTINCT Code_Article FROM produit"
 
Mais ca ne me sort que le code article alors que je voudrais avoir plusieurs champ d'inscris sur mon étiquette.
 
Si cela était possible j'aurais aimé quelque chose comme çà ( mais ce ne marche pas!) "SELECT (DISTINCT Code_Article), champ1, champ2, champ3, etc... FROM produits" ou ceci "SELECT (DISTINCT Code_Article), * FROM produits"  
 
 
j'ai essayé ceci également "SELECT DISTINCT Code_Article, champ1, champ2, champ3 FROM produit" mais ca me renvoi pas tout comme je le voudrais.
 
pour avoir comme résultat ( par exemple) une étiquette unique du genre :
 
Num CodeArt DésignArt   DésignRayon DésignFam DésignSFam NFour      Taille DésignCoul     DésignFabr       Prix
10    00153   Chaushiver Chaussures Chaussons Velcros        MARTIN     32       Bleu          MARTIN JO      115,00
38    00154   Chaushiver Chaussures Chaussons Enfants        ANDREA     33      Vert          Andrea             41,00
50    00157   Chaushiver Chaussures Chaussons Lacets         ANDREA    33       Noir           Andrea           108,00
78    00162   Chaushiver Chaussures Chaussons Velcros        BORÉAL     2 UK    Vert          Boréal              78,90
 
Le produit choisi dans le select distinct code_article m'importe peut car les champs sont presque tous identique et ceux qui sont différent ne me servent pas.
 
 
Si quelqu'un a une idée?
 
Merci d'avance

mood
Publicité
Posté le 17-07-2009 à 14:43:22  profilanswer
 

n°1906360
tet2neu
emmerdeur
Posté le 18-07-2009 à 19:29:13  profilanswer
 

Tu dis que les champs taille et couleur ne figurent pas sur l'étiquette mais dans ton exemple ils sont présents  [:payzan]
Et le champ "num" qui apparait également dans ton exemple semble être un numéro unique (identifiant ajouté par access ?) donc totalement inutile dans ton étiquette.

 

Peux-tu préciser si ta requête ne doit prendre en compte que les champs identiques, ou également d'autres champs ?

Message cité 1 fois
Message édité par tet2neu le 18-07-2009 à 19:29:26

---------------
RoadRunners - Mon Feed-back
n°1906362
claudelana
Posté le 18-07-2009 à 19:46:43  profilanswer
 

tet2neu a écrit :

Tu dis que les champs taille et couleur ne figurent pas sur l'étiquette mais dans ton exemple ils sont présents  [:payzan]  
Et le champ "num" qui apparait également dans ton exemple semble être un numéro unique (identifiant ajouté par access ?) donc totalement inutile dans ton étiquette.
 
Peux-tu préciser si ta requête ne doit prendre en compte que les champs identiques, ou également d'autres champs ?


 
Ce que je voulais dire c'est que les champs Tailles et Couleur ne seront pas inscrit sur l'étiquette.
 
En faite et visiblement si je fais un "SELECT DISTINCT CodeArt FROM Produit"
 
Quand j'imprime mes étiquettes, il me sort uniquement le champ CodeArt en evitant de me mettre les doublons, ce que je veux. Par contre je voudrais pouvoir également imprimer plusieurs autre champs sur mes étiquettes.
 
Si je fais "SELECT DISTINCT CodeArt, DésignRayon,  DésignFam FROM Produit" Il va supprimer les doublons dans ces trois champs, ce que je voudrais éviter. Donc mon idée (qui n'estpas bonne) était "SELECT [DISTINCT CodeArt] ( et uniquement sur ce champ) FROM Produit" et que je puisse imprimer tous les champs de la table sauf taille et couleur.
 
Je pene que dans access on ne peut pas travailler sur plusieurs champs si on ne met uniquement derriere le select qu'un seul champ. et ce que ej voudrais arrivé a faire c'est pouvoir afficher ou imprimer tous les champs que je veux en utilisant uniquement un select sur le CodeArt.
 
 
J'espere que j'ai été compréhensible ?
 
Claude

n°1906758
claudelana
Posté le 20-07-2009 à 12:17:09  profilanswer
 

J'ai trouvé une solution mais elle est un peu barbare. J'aimerais savoir s'il existe une requête pour éviter ce code ?  
 
<!--#Include File="odbc_open.asp"-->
<%
Dim objRS
Set objRS = Server.CreateObject("ADODB.Recordset" )
Set objRS00 = Server.CreateObject("ADODB.Recordset" )
 
'/ ** Requête SELECT DISTINCT sur 3 champs **/
strSQL = "SELECT DISTINCT Article, Rayon, Famille FROM MaTable WHERE Rayon='01' ORDER BY Article, Rayon, Famille"
 
'/ ** ouverture du recordset **/
objRS.Open strSQL, Conn, 3, 3
 
'/ ** Si ou moin un enregistrement est trouvé **/
If NOT(objRS.EOF AND objRS.BOF) Then  
 
'/ ** On boucle jusqu'à la fin **/
   DO WHILE NOT objRS.EOF
 
'/** On recherche un seul enregistrement dans la table (TOP 1) pour pouvoir récupèrer tous les champs **/
 
    strSQL00 = "SELECT TOP 1 * FROM MaTable WHERE Article='"&objRS("Article" ) &"' ORDER BY Rayon, Famille"
 
    objRS00.Open strSQL00, Conn, 3, 3
'/ ** Si l'enregistrement est trouvé on le récupère **/
    If NOT(objRS00.EOF AND objRS00.BOF) Then  
    response.write "<br> : " & objRS00("Numéro" ) & " " & objRS00("Désignation" ) & " " & objRS00("Description" ) & " " & objRS00("Prix" ) & " " & etc. ...
    End If
    objRS00.CLOSE
    objRS.MOVENEXT
   LOOP
End If
SET objRS00 = NOTHING
objRS.CLOSE
SET objRS =NOTHING
%>
%><!--#Include File="odbc_close.asp"-->
 
Mon idée c'est de faire un DISTINCT sur un seul champ (voir 3 maxi dans mon cas) mais surtout avoir un acces sur tous les champs de la table.
 
Si quelqu'un a une idée ? Mon code serait certainement plus propre si je pouvait le remplacer par une requête.
 
Merci d'avance de votre réponse

n°1906853
tet2neu
emmerdeur
Posté le 20-07-2009 à 15:38:06  profilanswer
 

J'ai vraiment du mal à saisir où tu veux en venir.
Si tu fais un distinct sur 3 champs et que tu récupères tous les autres champs, tu te retrouves avec toutes les lignes, le distinct ne sert à rien.
Autant faire un SELECT * FROM MaTable WHERE Rayon='01' [:jkley]  
 


---------------
RoadRunners - Mon Feed-back
n°1906856
tet2neu
emmerdeur
Posté le 20-07-2009 à 15:42:54  profilanswer
 

OK je viens de saisir avec ton code au dessus.
En fait tu prends les 3 champs de ton distinct, et la première ligne trouvée pour les autres.

 

Donc en fait, dans ton cas tu peux oublier le distinct et faire un group by

 

Si a, b et c sont les 3 champs de ton distinct et d, e et f les autres champs :

 
Code :
  1. select
  2.   a,
  3.   b,
  4.   c,
  5.   min(d) d,
  6.   min(e) e,
  7.   min(f) f
  8. from MatTable
  9. where ....
  10. group by
  11.   a,
  12.   b,
  13.   c
  14. order by...
 


Ca te sort tes 3 champs + le min trouvé pour les autres.


Message édité par tet2neu le 20-07-2009 à 15:43:57

---------------
RoadRunners - Mon Feed-back
n°2108273
longshot41
Marié
Posté le 27-10-2011 à 01:02:59  profilanswer
 

Navré de déterrer un vieux sujet, mais apparement si je suis tombé dessus, c'est que d'autres aussi.
 
La solution serait en rajoutant la clause having après le groupe by
 
groupe by Email, Nom, Prénom HAVING count( DISTINCT email ) = 1
 
Voir dans la doc, en fonction du type de base de donnée, mais ca doit être assez standard
 

n°2108445
lasnoufle
La seule et unique!
Posté le 27-10-2011 à 19:45:53  profilanswer
 

Sujet de qualité, avec des déterrages de qualité aussi. Ca m'fait un peu chier de répondre d'ailleurs, mais vu l'énormité postée au-dessus...

longshot41 a écrit :

La solution serait en rajoutant la clause having après le groupe by
 
groupe by Email, Nom, Prénom HAVING count( DISTINCT email ) = 1


Trop pas. Ta clause HAVING ne sert absolument à rien, elle ne filtre rien. Preuve par l'exemple:

create table test(mail varchar2(10), prenom varchar2(10), nom varchar2(10))
 
create table succeeded.
insert into test(mail, prenom, nom) values ('mail1','prenom1','nom1')
 
1 rows inserted
insert into test(mail, prenom, nom) values ('mail1','prenom2','nom2')
 
1 rows inserted
select distinct mail, nom, prenom
from test
group by mail, nom, prenom
having count(distinct mail)=1
 
MAIL       NOM        PRENOM      
---------- ---------- ----------  
mail1      nom1       prenom1    
mail1      nom2       prenom2    
 
2 rows selected


J'ai pas trop lu le reste mais la "vraie" réponse au premier post ca aurait plutot été de nettoyer ses données voire de revoir son modèle: s'il s'attend à ce qu'une adresse soit affectée à une unique personne et que c'est pas le cas, perso je considère que c'est un problème de données.
 
Un truc qui "marche" si on veut quand meme avoir qu'une seule ligne, c'est comme indiqué deux posts au-dessus:

create table test(mail varchar2(10), prenom varchar2(10), nom varchar2(10))
 
create table succeeded.
insert into test(mail, prenom, nom) values ('mail1','prenom1','nom1')
 
1 rows inserted
insert into test(mail, prenom, nom) values ('mail1','prenom2','nom2')
 
1 rows inserted
select distinct mail, min(nom), min(prenom)
from test
group by mail
 
MAIL       MIN(NOM)   MIN(PRENOM)  
---------- ---------- -----------  
mail1      nom1       prenom1      
 
1 rows selected


A+


---------------
C'était vraiment très intéressant.
n°2108786
tet2neu
emmerdeur
Posté le 30-10-2011 à 16:49:55  profilanswer
 

marrant ce topic, 10 ans après on arrive encore à nous proposer des trucs qui marchent pas :D


---------------
RoadRunners - Mon Feed-back
n°2119656
elievar2
Posté le 05-01-2012 à 11:42:09  profilanswer
 

Hello,
 
Je me demande si c'est possible tout de même avec "distinct".
Comme vous dites, il faudrait pouvoir preciser quelle des lignes on souhaite conserver (parmis les doublons du champ mail).
 
On va vouloir affichier MAIL, NOM, PRENOM et DATE, et ne choisir que la première occurence d'un MAIL unique.
Si l'on souhaite n'importe lequel, on n'eftectuera pas de tri supplémentaire. Mais en général, on cherche le 1er mail ou le dernier mail envoyé, ce qui implique un tri par date.
 
C'est exactement ce que je recherche, et je suis sur que cela est possible, mais je n'arrive pas à le faire (et ce malgré les 2 pages de post que je viens de voir).
 
L'idée serait de faire un TOP 1 sur un champs precis de la selection choisi.
 
Je pense que ce n'est pas la fonction distinct, car dépends du résultat du tableau retourné par le select et donc semble s'executer en dernier.
 
Cela doit être une autre methode. Si je trouve, je passserais une tête ici :)
 
Dur dur :)
 
Merci tout de même.
 
 
 
 
 
 
 

n°2119787
lasnoufle
La seule et unique!
Posté le 05-01-2012 à 17:49:40  profilanswer
 

Pas sur d'avoir compris ce que tu veux vu que si c'est ce que j'ai compris, c'est assez simple. Par exemple si tu veux le mail le plus récent:

create table test(mail varchar2(10), prenom varchar2(10), nom varchar2(10), date_mail date);
create table succeeded.

 

insert into test(mail, prenom, nom, date_mail) values ('mail1','prenom1','nom1', sysdate);
1 rows inserted

 

insert into test(mail, prenom, nom, date_mail) values ('mail1','prenom2','nom2', sysdate-1);
1 rows inserted

 

insert into test(mail, prenom, nom, date_mail) values ('mail2','prenom3','nom3', sysdate-4);
1 rows inserted

 

insert into test(mail, prenom, nom, date_mail) values ('mail2','prenom4','nom4', sysdate-3);
1 rows inserted

 

select *
from test;
MAIL       PRENOM     NOM        DATE_MAIL                
---------- ---------- ---------- -------------------------
mail1      prenom1    nom1       05-JAN-12                
mail1      prenom2    nom2       04-JAN-12                
mail2      prenom3    nom3       01-JAN-12                
mail2      prenom4    nom4       02-JAN-12                

 

4 rows selected

 

select t.mail, t.nom, t.prenom, t.date_mail
from (select mail, max(date_mail) as maxdate
      from test
      group by mail) temp
join test t on t.mail = temp.mail and t.date_mail = temp.maxdate;
MAIL       NOM        PRENOM     DATE_MAIL                
---------- ---------- ---------- -------------------------
mail1      nom1       prenom1    05-JAN-12                
mail2      nom4       prenom4    02-JAN-12                

 

2 rows selected

 

drop table test;
 drop table test succeeded.


Bon ca reste "facile" tant que tu te tiens au plus récent/plus ancien grace aux fonctions min & max. Si tu veux le 3ème plus récent ca va compliquer un peu.

 

D'ailleurs en écrivant ca, j'me suis apercu que ma réponse précédente stait aussi de la merde, décidément ce thread est maudit. Déjà ya pas besoin de distinct de tte facon, et en plus si les données c'est:
insert into test(mail, prenom, nom) values ('mail1','prenom1','nom2')
insert into test(mail, prenom, nom) values ('mail1','prenom2','nom1')
Mon truc renvoyait visiblement du caca.

 

Edit: ah mais OK je viens de relire, tu veux utiliser un distinct à tout prix. Ptin c'est pas mon jour. Mais je pense pas que ca soit possible alors.


Message édité par lasnoufle le 05-01-2012 à 17:51:40

---------------
C'était vraiment très intéressant.
n°2121104
tet2neu
emmerdeur
Posté le 12-01-2012 à 23:00:34  profilanswer
 

elievar2 a écrit :

Hello,

 

Je me demande si c'est possible tout de même avec "distinct".
Comme vous dites, il faudrait pouvoir preciser quelle des lignes on souhaite conserver (parmis les doublons du champ mail).

 

On va vouloir affichier MAIL, NOM, PRENOM et DATE, et ne choisir que la première occurence d'un MAIL unique.
Si l'on souhaite n'importe lequel, on n'eftectuera pas de tri supplémentaire. Mais en général, on cherche le 1er mail ou le dernier mail envoyé, ce qui implique un tri par date.

 

C'est exactement ce que je recherche, et je suis sur que cela est possible, mais je n'arrive pas à le faire (et ce malgré les 2 pages de post que je viens de voir).

 

L'idée serait de faire un TOP 1 sur un champs precis de la selection choisi.

 

Je pense que ce n'est pas la fonction distinct, car dépends du résultat du tableau retourné par le select et donc semble s'executer en dernier.

 

Cela doit être une autre methode. Si je trouve, je passserais une tête ici :)

 

Dur dur :)

 

Merci tout de même.

 



tu dédoublonnes pas en une seule requête simple, et surtout pas avec un distinct.

 
Code :
  1. select a.NOM, a.PRENOM, a.MAIL, a.DATE
  2. from ma_table a
  3. inner join (select MAIL, max(DATE) DATE_MAX
  4.            from ma_table
  5.            group by MAIL) b
  6. on a.MAIL = b.MAIL and a.DATE = b.DATE_MAX


Message édité par tet2neu le 12-01-2012 à 23:02:44

---------------
RoadRunners - Mon Feed-back
mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Suivante

Aller à :
Ajouter une réponse
 

Sujets relatifs
Asp detection de champ vide dans un recordset[ASP]Date
[Asp / VB ] Connexion distante a une base de donnée[ASP] Pilote ODBC Microsoft Access erreur ...
[ASP]Fonction replaceqcm, à plusieurs réponses !?
ASP - Arrondir.. ou tronquage partie entière...[MYSQL] Comment faire si deux champs portent le même nom?
[ASP][SQL] une requête pour connaitre la structure d'une table ??? 
Plus de sujets relatifs à : [ASP][SQL] comment faire un SELECT DISTINCT en ayant plusieurs champs?


Hit-Parade
Copyright © 1997-2012 Hardware.fr SARL / Groupe LDLC / LesNumeriques.com / Version anglaise du site: BeHardware