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 PostgreSQL Discussion :

Comment additionner les éléments d'une chaîne


Sujet :

Requêtes PostgreSQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Novembre 2015
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2015
    Messages : 57
    Par défaut Comment additionner les éléments d'une chaîne
    Bonjour,

    Dans une table de ma base PostgreSQL , j'ai une table T contenant deux colonnes, la première correspond à un identifiant et la seconde à une chaîne de caractères de la forme suivante : "nombre1+nombre2+..+nombreN".

    Ex :
    ID \ OPERATION
    1 \ 10+20+30
    2 \ 5+3+15+2
    3 \ 5+25+3+14+8

    Je souhaiterais écrire une requête SQL qui "interprête" le contenu de la colonne OPERATION et me permette de trouver le résultat de celle-ci pour obtenir ceci
    1 \ 60
    2 \ 25
    3 \ 55

    Je ne peux pas passer par une procédure stockée qui décomposerait ma chaîne en sous-éléments pour effectuer la somme, car je n'ai pas les droits sur la base pour pouvoir le faire et même si j'insiste, on ne me les donnera pas. il faut absolument que je fasse quelque chose du style :

    select ID , calculer( OPERATION )
    from T

    Je précise qu'il n'y a que des additions, et pas de parenthèse.

    J'ai cherché sur Internet s'il existait une telle fonction, en vain. De même sur le forum.

    En désespoir de cause, je me permets donc de vous adresser cette demande.

    D'avance Merci de l'attention que vous porterez à ma demande ainsi que, je l'espère, de vos futures réponses.

    Cordialement,

    GiDu

  2. #2
    Membre Expert
    Avatar de alassanediakite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2006
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Mali

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 1 599
    Billets dans le blog
    8
    Par défaut exercice assez interessant!
    Voici une solution
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    with r as(select t.id, string_to_array(t.operation,'+') as operation from t),
    r2 as
    (select r.id, somme
    from r, LATERAL unnest(operation) somme)
    select r2.id, sum(trim(r2.somme)::numeric) from r2 group by id
    @+

  3. #3
    Membre averti
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Novembre 2015
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2015
    Messages : 57
    Par défaut
    Bonjour,

    Merci pour votre réponse.

    Moi qui me trouvais pas trop mauvais en SQL, vous êtes plusieurs crans au dessus de moi. Je ne peux pas luter, vous employez des notions qui m'étaient complètement inconnues (la jointure lateral notamment).

    Malheureusement, votre réponse, qui bien évidemment fonctionne, ne peut répondre à mon problème.

    En effet, je dois rentrer ce code dans un logiciel qui génère du code SQL type Business Objects, donc impossible de mettre une jointure "lateral". Je n'ai pas pensez à vous l'indiquer dans mon précédent message car je n'imaginais pas une telle solution. Désolé.

    J'ai réussi à simplifier votre solution comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select id , sum( trim( somme )::numeric )
    from T ,
    lateral unnest( string_to_array( operation , '+' ) ) somme
    group by id

    Mais il faudrait que j'arrive à simplifier encore plus pour obtenir quelque chose qui ressemble à cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select id , sum( trim( unnest( string_to_array( operation , '+' ) ) )::numeric )
    from T
    group by id
    afin de pouvoir créer un objet dans le Designer BO avec le code : sum( trim( unnest( string_to_array( operation , '+' ) ) )::numeric ).

    Mais cette dernière requête ne fonctionne hélas pas, le message suivant s'affiche :
    SQL Error [0A000]: ERREUR: la fonction avec set-value a été appelé dans un contexte qui n'accepte pas un ensemble
    ce qui ne me surprend pas quand on regarde l'explication sur la jointure lateral.

    Auriez-vous SVP une alternative ?

    Encore Merci pour tout.

    Gidu

  4. #4
    Membre averti
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Novembre 2015
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2015
    Messages : 57
    Par défaut
    Finalement, en surfant sur le net à partir de ce que vous m'avez dit, j'ai finalement trouvé une solution que je vous partage :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select id ,
           ( select sum( s::numeric ) from unnest( string_to_array( operation , '+' ) ) s )
    from T

    Je ne vais pas clore la discussion tout de suite, au cas où vous souhaiteriez ajouter un commentaire.

    En tout cas, encore merci pour votre aide initiale, ça m'a mis sur la bonne piste.

    Cordialement,

    GiDu

  5. #5
    Membre Expert
    Avatar de alassanediakite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2006
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Mali

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 1 599
    Billets dans le blog
    8
    Par défaut
    Salut Gidu59
    Citation Envoyé par Gidu59 Voir le message
    Je ne vais pas clore la discussion tout de suite, au cas où vous souhaiteriez ajouter un commentaire.
    Qu'est ce que je peux dire de plus à part CHAPEAU!
    @+

  6. #6
    Membre averti
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Novembre 2015
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2015
    Messages : 57
    Par défaut
    Restons modeste, sans votre réponse initiale, je n'y serai pas parvenu.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 18/03/2008, 21h55
  2. Comment récupèrer les éléments d'une JList
    Par Orian dans le forum Composants
    Réponses: 13
    Dernier message: 10/09/2006, 11h53
  3. Réponses: 3
    Dernier message: 15/05/2006, 16h09
  4. [TestStand] Compter les éléments d'une chaîne de caractères
    Par capblans dans le forum Autres langages
    Réponses: 2
    Dernier message: 29/04/2005, 09h29

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