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

Langage SQL Discussion :

Créer un nouvel identifiant par concaténation


Sujet :

Langage SQL

  1. #1
    Futur Membre du Club
    Inscrit en
    Juin 2012
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Juin 2012
    Messages : 22
    Points : 8
    Points
    8
    Par défaut Créer un nouvel identifiant par concaténation
    Bonjour,

    Je travaille actuellement sur une table qui stocke les lignes suivantes

    id_magasin ; date ; nb_vente
    11 02042010 12
    11 03042010 29
    13 02042010 20

    Or j'aurais besoin de manipuler des id_magasin.date comme des individus.

    Il me semble qu'il me faut créer des identifiants uniques pour mes nouveaux individus.

    Je pensais donc les créer en concaténant l'id_magasin et la date, ce qui donnerait des id_magasin_date tel que : 11_02042010

    Est-ce une bonne idée ou il y a un moyen bcp plus efficace ?

    Merci d'avance

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    bonjour,

    que voullez-vous dire par ceci ?
    Or j'aurais besoin de manipuler des id_magasin.date comme des individus.

  3. #3
    Futur Membre du Club
    Inscrit en
    Juin 2012
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Juin 2012
    Messages : 22
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par punkoff Voir le message
    bonjour,

    que voullez-vous dire par ceci ?
    Pour l'instant les "individus" sont les magasins, mais j'aimerais que ce soit magasin associé à des dates et avoir un identifiant unique pour ces nouveaux individus.

    le magasin 11 le 13062011 serait un individu different du magasin 11 le 14062011.

  4. #4
    Membre expert

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2012
    Messages
    612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2012
    Messages : 612
    Points : 3 066
    Points
    3 066
    Par défaut
    Bonjour,

    Il suffit d'utiliser les deux colonnes ensemble comme identifiant (clé composite), concaténer est inutile (en plus d'être une mauvaise idée).

    Cordialement
    FSiebert

  5. #5
    Futur Membre du Club
    Inscrit en
    Juin 2012
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Juin 2012
    Messages : 22
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par FSiebert Voir le message
    Bonjour,

    Il suffit d'utiliser les deux colonnes ensemble comme identifiant (clé composite), concaténer est inutile (en plus d'être une mauvaise idée).

    Cordialement
    FSiebert
    Bonjour,

    Je suis pas sur d'avoir compris. :/

    Le problème est que quand je souhaite faire des sous requête du type :
    Obtenir les magasin.jour qui avait une animation de Danone mais pas d'animation de Nestlé ça devient compliqué

    Si j'avais un seul id je pourrais facilement faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT MAGASIN_JOUR
    from mega_table
    where animation_danone="oui"
    AND magasin_jour NOT IN (SELECT MAGASIN_JOUR
                                          from mega_table
                                       where animation_nestlé="oui")

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 197
    Points : 12 772
    Points
    12 772
    Par défaut
    Bonjour,
    Il suffit dans la requête de remplacer le NOT IN par NOT EXISTS, ou d'utiliser une jointure externe sur les deux colonnnes en question:
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT mt1.MAGASIN_JOUR
    FROM mega_table m1t
    LEFT OUTER JOIN mega_table mt2 on mt2.idmagasin = mt1.idmagasin and mt2.jour = mt1.jour and mt2.animation_nestlé = 'oui'
    WHERE mt1.animation_danone='oui' and mt2.idmagasin is null

    Tatayo.

    P.S. j'espère que la requête n'est que pour l'exemple, parce que sinon la modélisation laisse à désirer...

  7. #7
    Futur Membre du Club
    Inscrit en
    Juin 2012
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Juin 2012
    Messages : 22
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par tatayo Voir le message
    Bonjour,
    Il suffit dans la requête de remplacer le NOT IN par NOT EXISTS, ou d'utiliser une jointure externe sur les deux colonnnes en question:
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT mt1.MAGASIN_JOUR
    FROM mega_table m1t
    LEFT OUTER JOIN mega_table mt2 on mt2.idmagasin = mt1.idmagasin and mt2.jour = mt1.jour and mt2.animation_nestlé = 'oui'
    WHERE mt1.animation_danone='oui' and mt2.idmagasin is null

    Tatayo.

    P.S. j'espère que la requête n'est que pour l'exemple, parce que sinon la modélisation laisse à désirer...
    Merci je vais y reflechir.

    C'est pour un exemple, mais malheuresement mes données sont toutes organisés dans une megatable.

  8. #8
    Futur Membre du Club
    Inscrit en
    Juin 2012
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Juin 2012
    Messages : 22
    Points : 8
    Points
    8
    Par défaut
    J'ai essayé de faire ça mais ça n'a pas marché.

    En faite je pense que ça vient du fait que je n'ai pas 2 variables pour les animations mais 1 seule qui prends 2 valeurs (animation="danone" ou animation)= "nestlé".

  9. #9
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    donnez un jeu de donnée en entrée, et un jeu de donnée du resultat voulu.

    Sinon on va encore partir sur 3 pages a essayer de deviner ce que vous voullez

  10. #10
    Futur Membre du Club
    Inscrit en
    Juin 2012
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Juin 2012
    Messages : 22
    Points : 8
    Points
    8
    Par défaut
    MAGASIN JOUR ANIMATION
    1 14022011 D
    1 16022011 N
    1 16022011 D
    2 14022011 N
    1 14022011 N
    2 13022011 D

    J'aimerais obtenir les magasin_jour qui ont fait QUE des animations D (danone)
    Soit ici : le magasin 2 le jour 13022011


    Merci de m'accorder un peu de temps

    ps : ce que j'avais fait c'est concatener l'id_magasin et le jour, afin d'avoir des id_magasin_jour facilement manipulable car c'est plus qu'une seule variable que je pouvais utiliser dans un NOT IN.
    Ça marche, mais vous m'avez dit que c'était déconseillé.

  11. #11
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    la requête de tatayo répond à ce besoin, adaptez la correctement.

  12. #12
    Futur Membre du Club
    Inscrit en
    Juin 2012
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Juin 2012
    Messages : 22
    Points : 8
    Points
    8
    Par défaut
    je viens de comprendre, merci beaucoup.

    Est ce un raisonnement courant ? Car j'ai l'impression que c'est du bricolage comparé à la facilité du NOT IN avec un identifiant.

  13. #13
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    en fait pour votre cas de figure il y a 3 approches différente.

    Utiliser :
    - une jointure externe
    - un not in
    - un not exists

    Selon les SGBD ces 3 approches auront un plan d'execution idetnique ... ou non.

    Apres selon les plans et les perfs associées prenez la syntaxe la plus adaptée

  14. #14
    Futur Membre du Club
    Inscrit en
    Juin 2012
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Juin 2012
    Messages : 22
    Points : 8
    Points
    8
    Par défaut
    En faite non, je ne suis pas sur d'avoir compris comment l'appliquer.

    Je ne vois pas quelle variable joue le rôle de "null" pour être différenciée de celle qui respecte les conditions de jointure.

  15. #15
    Futur Membre du Club
    Inscrit en
    Juin 2012
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Juin 2012
    Messages : 22
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par punkoff Voir le message
    en fait pour votre cas de figure il y a 3 approches différente.

    Utiliser :
    - une jointure externe
    - un not in
    - un not exists

    Selon les SGBD ces 3 approches auront un plan d'execution idetnique ... ou non.

    Apres selon les plans et les perfs associées prenez la syntaxe la plus adaptée

    Comment pourrais-je faire avec un NOT IN.
    Je n'y arrive pas car il me semble qu'on peut l'utiliser que pour 1 variable à la fois, alors que j'aimerais le faire pour 2 variables.

    Merci pour votre réactivité en tout cas.

  16. #16
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Cretain SGBD accepte cette syntaxe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    where (col_1, col_2) not in (select col_1, col_2 from ..)
    Je ne vois pas quel variable joue le role de "null" pour être differencier de celle qui respecter les conditions de jointure.
    Pas compris.

  17. #17
    Futur Membre du Club
    Inscrit en
    Juin 2012
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Juin 2012
    Messages : 22
    Points : 8
    Points
    8
    Par défaut
    Malheureusement, le mien ne gère pas plusieurs colonnes pour le NOT IN.

    Mais j'ai finalement réussi à adapter la requete avec la jointure externe.

    J'aurais juste une dernière question. Ça fait un peu bricolage comme requête.

    Comment faire ça de manière plus propre (quitte à créer des tables) sachant qu'à la base j'ai seulement accès à cette "mega_table".

    Encore merci à tatayo et punkoff

    ps : pourriez vous me confirmer que dans le where final :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE mt1.animation_danone='oui' AND mt2.idmagasin IS NULL
    mt2.idmagasin IS NULL suffit car cela implique déjà que mt1.animation_danone='oui' ?

  18. #18
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Ca n'est pas du bricolage c'est une syntaxe acceptable.

    Pour la partie modéliastion allez sur le sous-forum concerné et exposé votre besoin (conseption / MCD)

    ps : pourriez vous me confirmer que dans le where final :
    WHERE mt1.animation_danone='oui' AND mt2.idmagasin IS NULL

    mt2.idmagasin IS NULL suffit car cela implique déjà que mt1.animation_danone='oui' ?

    Oui, je confirme.

    Par contre si vous posez une telle question c'est que vous n'avez pas compris comment marche une jointure externe.

    Lisez ceci : http://sqlpro.developpez.com/cours/sqlaz/jointures/

  19. #19
    Futur Membre du Club
    Inscrit en
    Juin 2012
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Juin 2012
    Messages : 22
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par punkoff Voir le message
    Ca n'est pas du bricolage c'est une syntaxe acceptable.

    Pour la partie modéliastion allez sur le sous-forum concerné et exposé votre besoin (conseption / MCD)



    Oui, je confirme.

    Par contre si vous posez une telle question c'est que vous n'avez pas compris comment marche une jointure externe.
    Lisez ceci : http://sqlpro.developpez.com/cours/sqlaz/jointures/
    Merci de ton retour.

    Pourquoi cela montre que je n'ai pas compris, au contraire non ?
    Je proposais une simplification du code que proposait tatayo.

  20. #20
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Oops,

    c'est moi qui ai lu trop vite.

    La syntaxe de tatayo n'est pas simplifiable au niveau des conditions, que ce soit dans la jointure ou dans la clause where.

    Quelle est votre requête actuelle ?

Discussions similaires

  1. [XL-2010] Créer un nouvel onglet dans le ruban par macro
    Par Patnel dans le forum Macros et VBA Excel
    Réponses: 13
    Dernier message: 23/05/2018, 12h25
  2. [AC-2003] Créer un n° de billet par concaténation
    Par maringot dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 29/09/2010, 11h37
  3. Réponses: 0
    Dernier message: 29/11/2009, 04h24
  4. Réponses: 5
    Dernier message: 09/09/2007, 16h40
  5. Réponses: 3
    Dernier message: 23/08/2007, 09h53

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