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éation d'une nouvelle colonne (temporaire) lors d'une requête


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 3
    Par défaut Création d'une nouvelle colonne (temporaire) lors d'une requête
    Bonjour, tout nouveau ici je me permets de demander de l'aide sur ce forum, étant tout nouveau dans le langage SQL.
    Pour vous expliquer mon problème, voici la situation : je possède une base de données contenant une colonne cp_multiplier. Les valeurs contenues dans cette colonne correspondent à un niveau précis d'un Pokémon (les correspondances sont disponibles ici : https://pokemongo.gamepress.gg/cp-multiplier), mais les niveaux ne sont pas directement inscrits dans la base de données.
    Je possède déjà une requête SQL presque complète que voici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SELECT gp.trainer_name AS Dresseur_nom, gp.pokemon_id AS Pokémon_ID, gp.cp AS Pokémon_CP, gp.num_upgrades AS Pokémon_upgrades, TRUNCATE(gp.num_upgrades / 2,1) AS Level_upgrades, gp.iv_defense AS Pokémon_DEF, gp.iv_attack AS Pokémon_ATK, gp.iv_stamina AS Pokémon_STA, gp.cp_multiplier AS Pokémon_CPMultiplier, gp.additional_cp_multiplier AS Pokémon_ADDCPMultiplier, gp.stamina AS Pokémon_HP, gp.stamina_max AS Pokémon_HPMAX, gd.name AS Arène_nom, g.team_id AS Arène_team, g.gym_points AS Arène_points, g.latitude AS Arène_latitude, g.longitude AS Arène_longitude, g.last_modified AS Date_Modification, g.last_scanned AS Date_Scan
    FROM gympokemon AS gp
    INNER JOIN gymmember AS gm
    ON gp.pokemon_uid = gm.pokemon_uid
    INNER JOIN gymdetails AS gd
    ON gm.gym_id = gd.gym_id
    INNER JOIN gym AS g
    ON gd.gym_id = g.gym_id
    WHERE gp.trainer_name = 'XXX' OR gp.trainer_name = 'XXX'
    ORDER BY gp.trainer_name ASC, gp.cp DESC;
    Cependant, je ne suis pas encore satisfait puisqu'au lieu d'afficher une colonne cp_multiplier j'aimerai afficher le niveau correspondant, mais sans devoir modifier la base de données, donc lors de l'exécution d'une requête SQL.
    J'ai cherché un moyen de faire cela, mais je ne sais pas exactement comment m'y prendre. J'ai commencé par introduire des conditions
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    IF gympokemon.cp_multiplier = 0.7317 THEN
    SET Level = '30'
    ELSEIF gympokemon.cp_multiplier = 0.71939909 THEN
    SET Level = '29'
    END IF;
    mais je ne suis pas sûr d'aller dans la bonne direction, en plus de ça il semble que je n'ai pas défini la variable 'Level' si jamais l'utilisation des conditions est la solution (si jamais elle existe).


    Voilà, j'espère avoir été clair dans mon post, et si besoin d'informations, n'hésitez pas à me les demander.

    Cordialement.

  2. #2
    Expert confirmé
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 465
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 465
    Par défaut
    Bonjour,
    Je vois ici quelques solutions:
    1. Une procédure stockée
    2. Une table de niveau
    3. Un ENORME CASE WHEN dans la requête
    4. Laisser le calcul au bon soin de l'application

    Malheureusement, les deux premières nécessitent de modifier la base de données... Mais ce sont à mon avis les deux plus simples.
    Pour ma part, je partirai quand même sur une table de niveaux.

    Tatayo.

  3. #3
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 136
    Par défaut
    La syntaxe IF .. ELSEIF .. ELSE .. END IF n'appartient pas au vocabulaire du langage SQL.
    En revanche, tu peux utiliser CASE WHEN .. THEN .. ELSE .. END pour ajouter une expression dans ton SELECT.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CASE WHEN gympokemon.cp_multiplier = 0.7317 THEN '30'
    WHEN gympokemon.cp_multiplier = 0.71939909 THEN '29'
    -- ELSE <valeur par défaut>
    END AS Level
    Edit : grilled
    Et la solution de la table de niveaux me semble aussi la meilleure
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  4. #4
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 3
    Par défaut
    Merci tatayo et al1_24 pour votre réponse.
    J'ai cherché sql "table de niveau" sur Google (étant donné que vous me l'avez tous les 2 recommandé) mais je n'ai rien trouvé de probant. Auriez-vous un bon lien qui explique cela ?

    Concernant la solution CASE WHEN, quel est son désavantage outre le fait de prendre une grande place au niveau de l'écriture de la requête ? Uniquement ne perte de performance ? Si c'est le cas, ma requête ne sera lancée que très rarement (uniquement lorsque je souhaiterai effectuer une recherche).
    J'ai quand même essayé de réaliser cette solution, voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT
    gp.trainer_name AS Dresseur_nom, gp.pokemon_id AS Pokémon_ID, gp.cp AS Pokémon_CP, gp.num_upgrades AS Pokémon_upgrades, TRUNCATE(gp.num_upgrades / 2,1) AS Level_upgrades, gp.iv_defense AS Pokémon_DEF, gp.iv_attack AS Pokémon_ATK, gp.iv_stamina AS Pokémon_STA, REPLACE(gp.cp_multiplier, ',', '.') AS Pokémon_CPMultiplier, gp.additional_cp_multiplier AS Pokémon_ADDCPMultiplier, gp.stamina AS Pokémon_HP, gp.stamina_max AS Pokémon_HPMAX, 
    CASE gp.cp_multiplier
    WHEN 0.7317 THEN '30'
    ELSE 'autre'
    END AS Level
    FROM gympokemon AS gp
    ORDER BY gp.trainer_name ASC, gp.cp DESC;
    Il manque une partie de la précédente requête car je n'ai pas réussi à la faire marcher sur plusieurs tables, mais avec cette requête le problème est que la colonne Level ne contient que la valeur "autre", même quand la valeur dans la colonne cp_multiplier correspond à la condition (soit 0.7317). J'ai effectué un REPLACE pour changer les virgules en points car il semble que WHEN 0,7317 entraîne des erreurs.

    Cordialement.

  5. #5
    Expert confirmé
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 465
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 465
    Par défaut
    La "table de niveau", n'est en fait qu'une table avec... tes niveaux ! Bref une table toute simple, qui te permet de déterminer le niveau d'un joueur en fonction du cp_multiplier.
    C'est en gros la version SGBD du tableau que tu nous as indiqué en lien.
    L'avantage de cette table est de permettre de modifier ces fameux niveau sans rien toucher d'autre que le contenu de cette table.
    Sinon pour ton CASE, tu ne reçoit que 'autre' car tu n'as mis qu'un seul WHEN.
    Il faut faire ainsi:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    select (case cp_multiplier when 1 then 'A' when 2 then 'B' when 3 then 'C' else 'D') as MaColone
    From MaTable
    L'inconvénient ici est que si tu dois ajouter un niveau, ou changer les "seuils", il te faut modifier la requête.
    Et si tu as 150 niveaux, imagine ce que ça donne niveau SQL...

    Tatayo.

  6. #6
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 3
    Par défaut
    Effectivement, je pensais que quand vous parliez de table de niveaux vous parliez en terme technique
    Alors, voilà j'ai amélioré mon code :
    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    SELECT
    gp.trainer_name AS Trainer_Name,
    gp.pokemon_id AS Pokémon_ID,
    gp.cp AS Pokémon_CP,
    gpl.level AS Pokémon_WildLevel,
    TRUNCATE(gp.num_upgrades / 2,1) AS Pokémon_LevelUpgrades,
    gpl.level + (gp.num_upgrades / 2) AS Pokémon_Level,
    gp.num_upgrades AS Pokémon_Upgrades,
    gp.iv_defense AS Pokémon_DEF,
    gp.iv_attack AS Pokémon_ATK,
    gp.iv_stamina AS Pokémon_STA,
    gp.cp_multiplier AS Pokémon_CPMultiplier,
    gp.additional_cp_multiplier AS Pokémon_ADDCPMultiplier,
    gp.stamina AS Pokémon_HP,
    gp.stamina_max AS Pokémon_HPMAX,
    gd.name AS Gym_Name,
    g.team_id AS Gym_Team,
    g.gym_points AS Gym_Points,
    g.latitude AS Gym_Latitude,
    g.longitude AS Gym_Longitude,
    g.last_modified AS Date_Modification,
    g.last_scanned AS Date_Scan
    FROM gympokemonlevel AS gpl
    INNER JOIN gympokemon AS gp
    ON gpl.cp_multiplier = gp.cp_multiplier
    INNER JOIN gymmember AS gm
    ON gp.pokemon_uid = gm.pokemon_uid
    INNER JOIN gymdetails AS gd
    ON gm.gym_id = gd.gym_id
    INNER JOIN gym AS g
    ON gd.gym_id = g.gym_id
    WHERE gp.trainer_name = 'XXX'
    ORDER BY gp.trainer_name ASC, gp.cp DESC;
    Mais il me reste un tout dernier souci. Pour mon exemple, j'ai crée la table gympokemonlevel dans la base de données où sont la majeure partie des données. Mais comme c'est une base générée et gérée par un logiciel (en l'occurrence une map de scan ici) j'aimerai externaliser la table gympokemonlevel dans une autre base de données. Est-il possible avec une requête d'utiliser 2 bases de données différentes ? (j'utilise HeidiSQL pour exécuter mes requêtes et analyser les résultats).

    Cordialement.

  7. #7
    Expert confirmé
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 465
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 465
    Par défaut
    Ca dépend du SGBD, que tu n'as pas précisé.
    Donc il faut regarder dans la documentation de ce dernier pour savoir si c'est possible.

    Tatayo.

Discussions similaires

  1. Réponses: 2
    Dernier message: 21/07/2012, 23h24
  2. Réponses: 5
    Dernier message: 16/06/2006, 21h16
  3. Réponses: 2
    Dernier message: 07/06/2006, 14h43
  4. Réponses: 1
    Dernier message: 10/05/2006, 15h01
  5. Debutant SQL : Comment inserer une nouvelle colonne dans une
    Par cquadjul dans le forum Langage SQL
    Réponses: 3
    Dernier message: 26/07/2005, 21h34

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