none
sql server 2005 pivot + concatenation ou agregation RRS feed

  • Question

  • Bonjour,
    je viens de decouvrir la fonction "pivot" permettant le regroupement de données (mais tous les exemples parlent de colonnes numériques !).

    moi je veux a partir d'une "famille" creer une colonne contenant toutes les sous_famille de niveau 1 uniquement(donc concatener du string !). Je suppose que la fonction pivot est bien indiquée pour faire ceci.
    ma table contient les champs suivants
    id, id_categorie, parent, niveau, famille, s-famille

    je travaille en asp.net 2 vb avec sql 2005
     
    je rajoute qu'il existe une fonction "LISTAGG" mais qui ne marche pas avec sql server 2005 
    exemple :
    CREATE TABLE Strings (String VARCHAR(20))

    INSERT Strings VALUES ('A')
    INSERT Strings VALUES ('B')
    INSERT Strings VALUES ('C')

    agregation:
    SELECT LISTAGG(String) FROM Strings

    résultat:
     'A, B, C'

    ---------------------

    il existe bien ceci
    SELECT String + ', ' AS [text()]
    FROM Strings
    ORDER BY String
    FOR XML PATH('')

    mais le FOR XML PATH('') est rejeté par le pivot !

    voici ma requette  (mais sans agregation)

    DECLARE ze_Cursor CURSOR FOR
    SELECT
    id, id_categorie, parent, niveau, rayon, famille
    FROM T_Tree
    WHERE niveau = '0' or niveau ='1'

    OPEN ze_Cursor

    --parcourir les enregistrements du curseur.
    FETCH NEXT FROM ze_Cursor

    WHILE @@FETCH_STATUS = 0
    BEGIN
    FETCH NEXT FROM ze_Cursor
    END

    CLOSE ze_Cursor
    DEALLOCATE ze_Cursor


     
    merci pour votre aide
     

    mardi 19 décembre 2006 11:20

Toutes les réponses

  • Bonjour,

    Personnellement j'essayerais avec un fonction d'agrégat écrit en .net les seules à accepter des chaïnes de caractères...
    Sinon popur tester il en existe une autre native dans SQL Server : CHECKSUM_AGG mais c'est uniquement pour vérifier l'effet du pivot avec...

    Sinon ici :
    http://msdn2.microsoft.com/en-us/library/ms190678.aspx

    Il y a une  description, et il y a des exemples fournis avec SQL Server.

    Cordialement

    mercredi 20 décembre 2006 16:56
  • merci Christian pour votre aide

    j'ai trouvé une solution avec les curseurs

    DECLARE @id int, @n_Parent int, @niv int, @rayon_nom NVARCHAR(50), @famille_nom NVARCHAR(50)

    DECLARE @id_2 int, @n_Parent_2 int, @niv_2 int, @rayon_nom_2 NVARCHAR(50), @famille_nom_2 NVARCHAR(50)

    DECLARE curseur1 CURSOR

    FOR select id_categorie , parent , niveau, rayon , famille FROM T_Tree WHERE niveau = '0' or niveau ='1'

    OPEN curseur1

    FETCH curseur1 INTO @id , @n_Parent , @niv , @rayon_nom , @famille_nom

    WHILE @@FETCH_STATUS = 0

    BEGIN

    FETCH curseur1 INTO @id , @n_Parent , @niv , @rayon_nom , @famille_nom

    DECLARE curseur2 CURSOR

    FOR SELECT id_categorie , parent , niveau, rayon , famille FROM T_Tree

    WHERE niveau = '0' or niveau ='1'

    OPEN curseur2

    FETCH NEXT FROM curseur2 INTO @id_2 , @n_Parent_2 , @niv_2 , @rayon_nom_2 , @famille_nom_2

    WHILE @@FETCH_STATUS = 0

    BEGIN

    print @rayon_nom_2 +' > ' + @famille_nom_2

    FETCH NEXT FROM curseur2 INTO @id_2 , @n_Parent_2 , @niv_2 , @rayon_nom_2 , @famille_nom_2

    END

    END

    CLOSE curseur1

    DEALLOCATE curseur1

    CLOSE curseur2

    DEALLOCATE curseur2

     

    le seul dommage c'est le "print"

    j'aurais voulu "recuperer" toutes les familles d'un rayon dans un champs unique !

    et pour l'instant je n'ai qu'un affichage console avec une ligne par famille (je suis encore loin de mon idée)

    Par contre en .net vb je veux bien avoir la solution ! oups tout au moins une piste :) 

    merci encore

    mercredi 20 décembre 2006 17:09
  • Bonjour,

    Au lieu du print on peut travailler avec une autre variable ou faire un INSERT / UPDATE dans une table...

    On pourrait aussi utiliser une série de sous-requêtes (plus lourd sans doute)...

    Au niveau des exemples d'aggrégats en .net il y en a 2 ou 3 ici :
    http://www.microsoft.com/downloads/details.aspx?FamilyID=e719ecf7-9f46-4312-af89-6ad8702e4e6e&DisplayLang=en
    dans les exemples de SQL 2005

    Cordialement

    jeudi 21 décembre 2006 12:35
  • merci pour tout

    je possede les exemples sql sur mon ordi, mais pas de solution dans un select avec pivot :(

    j'ai modifié ma requette avec une ecriture sur une table mais je me retrouve avec autant de lignes que de famille (un ligne par rayon et autant de lignes par famille pour un rayon).

    je n'arrive pas a faire une ligne unique avec 2 champs :

    un champs pour le rayon et un champs contenant toutes les familles qui lui sont associées.

    donc soit une requette avec pivot soit une requette avec curseur permettant cela.

    bonne journée et encore merci

    vendredi 22 décembre 2006 11:52