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

Développement SQL Server Discussion :

Agregate Function pour concatener


Sujet :

Développement SQL Server

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    202
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 202
    Par défaut Agregate Function pour concatener
    * Bonjour, *

    Je sais vous allez me dire que ce que je demande est crados mais il faut que ça fonctionne comme ça, pas d'explication...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    select champ1,MaSuperFonction(champ2) from maTable
    group by champ1
    Le quid est le suivant: La fonction MaSuperFonction existe t-elle ?
    Je veux qu'elle concatène toutes les valeurs de champ2 (en séparant par un tiret même si possible)

    D'après ce que j'ai lu sur les docs, il faut que je créé une fonction (stockée) et que je créé un truc un peu bizarre en VB ou en C#.
    Je veux juste savoir si il existe une méthode plus simple.

    Merci

  2. #2
    Membre Expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Par défaut
    crados mais il faut que ça fonctionne comme ça, pas d'explication...
    Ok on dis rien alors mais c'est pas l'envie qui manque

    Fait une fonction scalaire prenant en paramètre champ1 et qui concatène champ2 et le retourne....


    [Edit]
    Dis nous en un peu plus: comment exploitera tu ce champ2 concaténé?
    [/Edit]

  3. #3
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Par défaut
    Même remarque que iberserk ...

    D'après ce que j'ai lu sur les docs, il faut que je créé une fonction (stockée) et que je créé un truc un peu bizarre en VB ou en C#.
    Je veux juste savoir si il existe une méthode plus simple.
    Oui. Vous n'êtes pas obligé d'écrire un aggrégat d'assembly.

    D'un autre côté la colonne (et non pas le champ) 2 devrait contenir une seule valeur... encore une modélisation m... Bref.
    Donc sans exemple de ce que vous avez, difficile de vous aider.

    @++

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 001
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 22 001
    Billets dans le blog
    6
    Par défaut
    Cette demande de fonction d'agrégation est une pure bêtise. En effet une fonction d'agrégation n'a, par essence, aucun ordre séquentiel de traitement.
    Par exemple SUM qui est réellement une fonction d'agrégation, donne le même résultat si je commence dans l'ordre du plus petit au plus grand, ou inversement, ou en faisant plusieurs sommes partielle puis une somme finale des sommes partielles. Or les les bases de données relationnelles fonctionnent de manière ensembliste ce qui veut dire que toutes les opérations non ordonnées (c'est à dire la plupart) peuvent être jouées avec plusieurs threads en parallèle !

    Il n'en va généralement pas de même avec la concaténation de chaines, qui, la plupart du temps nécessite un ordre de traitement séquentiel !
    En conclusion il ne s'agit pas d'une agrégation de données.
    Il existe c'est vrai quelque SGBD non relationnel comme MySQL (en fait un ersatz de SGBDR : http://blog.developpez.com/sqlpro/p9...udre-aux-yeux/) qui proposent une telle ineptie, par exemple avec la fonction GROUP_CONCAT !

    La solution consiste donc à utiliser une requête récursive pour ordonner cette concaténation. J'ai donné un exemple ici : http://sqlpro.developpez.com/cours/s...ursives/#LIV-D

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  5. #5
    Membre Expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Par défaut
    Cette demande de fonction d'agrégation est une pure bêtise. En effet une fonction d'agrégation n'a pas essence aucun ordre séquentiel de traitement.
    Par exemple SUM qui est réellement une fonction d'agrégation, donne le même résultat si je commence dans l'ordre du plus petit au plus grand, ou inversement, ou en faisant plusieurs sommes partielle puis une somme finale des sommes partielles. Or les les bases de données relationnelles fonctionnent de manière ensembliste ce qui veut dire que toutes les opérations non ordonnées (dons la plupart) peuvent être jouées avec plusieurs threads en parallèle !

    Il n'en va généralement pas de même avec la concaténation de chaines, qui, la plupart du temps nécessite un ordre de traitement séquentiel !
    En conclusion il ne s'agit pas d'une agrégation de données.
    Il existe c'est vrai quelque SGBD non relationnel comme MySQL (en fait un ersatz de SGBDR : http://blog.developpez.com/sqlpro/p9...udre-aux-yeux/) qui proposent une telle ineptie, par exemple avec la fonction GROUP_CONCAT !

    La solution consiste donc à utiliser une requête récursive pour ordonner cette concaténation. J'ai donné un exemple ici : http://sqlpro.developpez.com/cours/s...ursives/#LIV-D

    A +
    Tout à fait... c'est pourquoi je lui demandais ce qu'il comptait faire du resultat...
    Je ne serais pas surpris qu'il s'en serve ensuite dans son code client en utilisant un SPLIT() par exemple...

    Comme dirais Mr SEMOUN "C'est pas joli joli"

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    202
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 202
    Par défaut
    Je sais, tout ceci n'est pas dans les règles de l'art.

    Clairement, le champ concaténé sera INEXPLOITABLE mais ce n'est pas vraiment mon problème.

    Tu dit qu'il est possible de faire une fonction scalaire sans passer par un assembly mais je n'y arrive pas.
    As tu un exemple quelque part ?

    Merci

  7. #7
    Membre Expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Par défaut
    Tu n'as pas dû chercher beaucoup...

    Exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    CREATE FUNCTION FN_CONCATENATE_CHAMP2 (@CHAMP1 VARCHAR(50))
    RETURNS VARCHAR(MAX)
    AS
    BEGIN
    	DECLARE @RESULT VARCHAR(MAX)=''
    	DECLARE @SEPARATOR CHAR(1)=';'
    	SELECT @RESULT=@RESULT+CHAMP2+@SEPARATOR
    	FROM TABLE_A
    	WHERE CHAMP1=@CHAMP1
    	RETURN @RESULT
    END
    Libre à toi de supprimer le dernier séparateur...
    Reste le problème remonté par SQLPRO concernant l'ordre des éléments dans la liste, mais peut être celui-ci n'a aucune importance?

    Si j'ai bien compris on t'oblige à faire çà...
    Attention à ne pas être poursuivi pour complicité

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    202
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 202
    Par défaut
    Merci pour ta réponse mais cette technique est très très lente car il faut scruter la table pour chaque enreg à retourner.
    J'ai beau mettre des index, c'est long...
    Quand on utilise une fonction comme MAX() ou MIN(), ça travaille pas sur toutes les lignes, mais juste celles identifiées lors du group BY...

    Merci

  9. #9
    Membre Expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Par défaut
    Merci pour ta réponse mais cette technique est très très lente car il faut scruter la table pour chaque enreg à retourner.
    Bien sûr!

  10. #10
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 001
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 22 001
    Billets dans le blog
    6
    Par défaut
    Je vous ais donné la solution, mais visiblement vous ne lisez pas....

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

Discussions similaires

  1. Aide pour concatener plusieurs videos
    Par fonkyom dans le forum Multimédia
    Réponses: 4
    Dernier message: 01/02/2008, 09h31
  2. requete SQL pour concatener les valeurs d'une colonne
    Par moabomotal dans le forum Langage SQL
    Réponses: 2
    Dernier message: 23/08/2007, 11h59
  3. Probleme pour concatener 2 objets Set
    Par PORTES dans le forum C++
    Réponses: 13
    Dernier message: 16/04/2007, 15h02
  4. [WORD] Problème pour concatener 2 fichiers .doc
    Par marco000 dans le forum VBA Word
    Réponses: 14
    Dernier message: 27/08/2006, 17h49
  5. Réponses: 10
    Dernier message: 13/02/2006, 15h29

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