IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes et SQL. Discussion :

Minimum plusieurs colonnes


Sujet :

Requêtes et SQL.

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Minimum plusieurs colonnes
    Bonjour,
    Je travaille sur une base Access dans laquelle se trouve une table produit avec en colonne 1 mon champs produits (plusieurs lignes par produits possibles) et en colonnes 2, 3, 4 et 5 des prix correspondant à différentes versions de mon produit.
    Je souhaite faire une requête qui me donne en colonne 1 mon champs produits (mais cette fois ci avec une ligne par produit) et en colonne 2 le minimum du prix trouvé sur mes colonnes 2,3,4,5 ainsi que mes lignes pour les produits présents sur plusieurs lignes.
    Pour le min par ligne, j'utilise les opérations de regroupement et min, mais c'est pour trouver le minimum de mes 4 colonnes que cela se complique.
    Avez-vous une idée pour m'aider svp ??? Je suis novice en access, j'ai vraiment besoin de votre aide !
    Un grand merci d'avance

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour et bienvenue sur le forum Office de DVP.

    D'abord pourquoi les prix sont mis sur différentes colonnes (je pense à un problème de conception).

    Philippe

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    La base Access est alimentée directement par un autre logiciel qui nous créé la table telle quelle. Ce n'est pas un choix de ma part malheureusement...

  4. #4
    Nouveau Candidat au Club
    Inscrit en
    Août 2009
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    Bonjour,
    Vous pouvez calculer le minimum de 2 colonnes avec la fonction vraifaux.
    minimum:Vraifaux([a]<[b];[a];[b])
    Pour 4 colonnes vous pouvez enchainer 2 niveau de requetes (comparaison de a et b et de c et d, puis comparaison des 2 minima résultant) ou noter dans l'expression 4 vraifaux en cascade pour les 4 minimum possible.

  5. #5
    Expert confirmé

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 419
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 419
    Points : 4 297
    Points
    4 297
    Par défaut
    tu ajoutes la fonction suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Function minimum(ParamArray x() As Variant) As Variant
    Dim u As Variant
    Dim mini As Variant
    On Error GoTo fin
    mini = x(0)
    For Each u In x
    If u < mini Then mini = u
    Next u
    minimum = mini
    Exit Function
    fin:
    minimum = "erreur"
    End Function
    ensuite tu fais un select minimum(colonne1;colonne2;..colonnen)

    le nombre de colonnes n'est pas limité

  6. #6
    Expert confirmé
    Avatar de vodiem
    Homme Profil pro
    Vivre
    Inscrit en
    Avril 2006
    Messages
    2 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Vivre
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2006
    Messages : 2 895
    Points : 4 325
    Points
    4 325
    Par défaut
    salut Philippe JOCHMANS , random et bienvenu stephbo et pepparkakor,

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    select c1, min(c) as mini from
      (
      select c1, c2 as c from t1
      union
      select c1, c3 as c from t1
      union
      select c1, c4 as c from t1
      union
      select c1, c5 as c from t1
      )
    group by c1


  7. #7
    Expert éminent sénior

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    Points : 32 311
    Points
    32 311
    Par défaut
    Citation Envoyé par vodiem Voir le message
    salut Philippe JOCHMANS , random et bienvenu stephbo et pepparkakor,

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    select c1, min(c) as mini from
      (
      select c1, c2 as c from t1
      union
      select c1, c3 as c from t1
      union
      select c1, c4 as c from t1
      union
      select c1, c5 as c from t1
      )
    group by c1

    Ou comment tuer les performances

    La solution de random est préférable je pense

  8. #8
    Expert éminent sénior

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    Points : 32 311
    Points
    32 311
    Par défaut
    Au pire si vraiment on veut éviter le VBA, on utilise une syntaxe avec switch

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT
    ID,
    SWITCH(
    (C2<=C3 AND C2<=C4 AND C2<=C5), C2,
    (C3<=C2 AND C3<=C4 AND C3<=C5), C3,
    (C4<=C2 AND C4<=C3 AND C4<=C5), C5,
    true,C5) AS C
    FROM matable
    C'est lourd à rédiger mais performant

  9. #9
    Expert confirmé
    Avatar de vodiem
    Homme Profil pro
    Vivre
    Inscrit en
    Avril 2006
    Messages
    2 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Vivre
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2006
    Messages : 2 895
    Points : 4 325
    Points
    4 325
    Par défaut
    salut Tofalu,
    Citation Envoyé par Tofalu
    Ou comment tuer les performances
    il est fort probable, mais avec la même table en union je me demande si l'union n'est pas plus rapide qu'une union multi table.

    j'aurais surement aussi opté pour un switch() c'était pour ne pas plagier le iif() bien que la fonction de random est élégante et peut être une bonne base pour d'autres exploitations.

  10. #10
    Expert éminent sénior

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    Points : 32 311
    Points
    32 311
    Par défaut
    Voilà ce que donne le Showplan en mode debug

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    --- Requête1 ---
     
    - Inputs to Query -
    Table 't1'
    Table 't1'
    Table 't1'
    Table 't1'
    - End inputs to Query -
     
    01) Union table 't1' and table 't1'
          store result in temporary table
    02) Union result of '01)' and table 't1'
          store result in temporary table
    03) Union result of '02)' and table 't1'
          store result in temporary table
    04) Group result of '03)'
    4 accès successifs à t1

  11. #11
    Expert confirmé
    Avatar de vodiem
    Homme Profil pro
    Vivre
    Inscrit en
    Avril 2006
    Messages
    2 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Vivre
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2006
    Messages : 2 895
    Points : 4 325
    Points
    4 325
    Par défaut
    Citation Envoyé par Tofalu
    4 accès successifs à t1
    oui mais cela ne veux pas forcement dire que c'est moins rapide.

    j'ai donc fait des tests pour éclaircir cette question de performance.

    moyenne de 10 mesure (en seconde) sur 100 000 enregistrements:

    2,013392857 minimum()
    2,822916666 switch()
    2,880859375 union t1
    2,900390625 union t1,t2,t3,t4 (t1=t2=t3=t4)


  12. #12
    Expert éminent sénior

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    Points : 32 311
    Points
    32 311
    Par défaut
    Citation Envoyé par vodiem Voir le message
    oui mais cela ne veux pas forcement dire que c'est moins rapide.

    j'ai donc fait des tests pour éclaircir cette question de performance.

    moyenne de 10 mesure (en seconde) sur 100 000 enregistrements:

    2,013392857 minimum()
    2,822916666 switch()
    2,880859375 union t1
    2,900390625 union t1,t2,t3,t4 (t1=t2=t3=t4)

    Attention à ce genre de tests avec un UNION. L'union va forcer le moteur à retrier les données. Si l'ordre de tri de l'union est le même que celui de l'indexation naturelle de la table, cela va aller très vite. En revanche si c'est mélangé, les unions successifs vont faire des tris inutiles. Ce qui causera un plus grand écart entre les deux premières solutions avec les deux dernières. Ceci dit, cela ne jouera à priori en rien dans la différence des deux unions qui semble aussi rapide les uns que les autres. En revanche, je suis très déçu par le switch. Il faudrait tester en intégrant ce switch dans un select case en VBA, bien que le nombre d'opération justifie finalement cette lenteur.

Discussions similaires

  1. Maximum ou minimum entre plusieurs colonnes
    Par theworst dans le forum SQL
    Réponses: 2
    Dernier message: 04/03/2009, 10h34
  2. Requête à plusieurs colonnes avec la fonction COUNT
    Par zigune dans le forum Langage SQL
    Réponses: 2
    Dernier message: 18/11/2004, 10h43
  3. Query sur plusieurs colonnes avec count(distinct...)
    Par Jeankiki dans le forum Langage SQL
    Réponses: 2
    Dernier message: 18/08/2004, 15h22
  4. Remplacer plusieurs colonnes par un 'alias'
    Par zestrellita dans le forum Langage SQL
    Réponses: 7
    Dernier message: 22/04/2004, 16h51
  5. [VB6] [Interface] ComboBox à plusieurs colonnes
    Par mtl dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 30/03/2004, 17h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo