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

MS SQL Server Discussion :

[SQLSRV2K5] - Requete pour hierarchie


Sujet :

MS SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2006
    Messages : 104
    Par défaut [SQLSRV2K5] - Requete pour hierarchie
    Bonjour,

    je suis en train d'essayer de construire une requête sql pour créer une hierarchie (5 niveaux)
    les données sont dans une table avec "Code Parent" , "Code enfant" et un niveau.

    J'ai fait la requête suivante :

    select
    H3.ParentLabel as NIVEAU0,
    H2.ParentLabel as NIVEAU1,
    H1.ParentLabel as NIVEAU2,
    H.ParentLabel as NIVEAU3 ,
    H.ChildLabel AS NIVEAU4
    from Dim_Hierarchies H
    left OUTER JOIN Dim_Hierarchies H1
    ON H.ParentId = H1.ChildId
    and H.ParentCode = H1.ChildCode
    LEFT OUTER JOIN Dim_Hierarchies H2
    ON H1.ParentId = H2.ChildId
    and H1.ParentCode = H2.ChildCode
    LEFT OUTER JOIN Dim_Hierarchies H3
    ON H2.ParentId = H3.ChildId
    and H2.ParentCode = H3.ChildCode

    Celle-ci me retourne bien les lignes avec les 5 niveaux quand tout est renseigné mais il y a des lignes ou il n'y a que 2 ou 3 niveaux renseignés et les niveaux supérieurs sont NULL alors que je veux que ces informations remontent d'un ou plusieurs niveaux.

    Résultat de ma requête:
    niv 0 niv1 niv2 Niv3 Niv4

    NULL NULL NULL AAA Other t
    NULL NULL NULL BBB Dev eco
    NULL NULL AAA Dev eco yyyy
    NULL AAA Dev eco yyyy ZZZZ
    AAA Dev eco Dev eco1 Dev eco3 XXXX

    Ce que je cherche à obtenir c que le niveau 3 et 4 de ma première ligne soit au niveau 0 et 1 car il n'y a pas de hierarchie en dessous et pareil pour la ligne 2, 3 et 4

    merci

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 010
    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 010
    Billets dans le blog
    6
    Par défaut
    Intéressez vous aux CTE récursives pour faire cela. Commencez par lire l'article que j'ai écrit à ce sujet :
    http://sqlpro.developpez.com/cours/s...te-recursives/

    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/ * * * * *

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2006
    Messages : 104
    Par défaut
    Bonjour,

    Merci. J'ai pris exemple sur les CTE mais j'ai un problème sur les datas type pour cette requête.
    Je ne comprends ou se trouve le problème car je passe par un CAST qui devrait résoudre le pb mais cela ne fonctionne toujours pas.

    Voici la requête:

    WITH H ([CountryId],[Data], [Level],[path_name]) AS
    ( SELECT A.[ParentId] AS CountryId
    , A1.[Label] as Data
    ,0 AS [Level]
    ,CAST(''AS VARCHAR(MAX))as path_name
    FROM [dbo].[Dim_tableA ] A
    INNER JOIN tableA1 A1
    ON A.[ParentId] = A1.[Id]
    WHERE NOT EXISTS (
    SELECT *
    FROM [dbo].[Dim_tableC] C
    WHERE C.[ChildId] = A.[ParentId]
    )
    GROUP BY A1.[Label], A.[ParentId]
    UNION ALL
    SELECT A.[ChildId] AS CountryId
    ,H.[Data]
    ,H.[Level] + 1 AS [Level]
    , CAST(H.[path_name] AS VARCHAR (MAX)) + CAST(H.[Data] AS VARCHAR(MAX))
    FROM [dbo].[Dim_table] A
    INNER JOIN H
    ON H.[CountryId] = A.[ParentId]
    )
    select *
    from H
    order by H.path_name, CountryId

    message d'erreur:
    Types don't match between the anchor and the recursive part in column "path_name" of recursive query "H".

    J'ai essayé avec des CAST sur les champs Data sur le premier SELECT du CTE mais rien ne résoud le pb

    Merci pour votre aide...

  4. #4
    Membre expérimenté
    Avatar de Lyche
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2007
    Messages
    2 523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 523
    Billets dans le blog
    4
    Par défaut
    Balises code svp
    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
     
    WITH H ( [CountryId]
            , [Data]
            , [Level]
            , [path_name] ) AS
    (
    SELECT A.[ParentId] AS CountryId
         , A1.[Label] AS Data
         , 0 AS [Level]
         , CAST(''AS VARCHAR(MAX)) AS path_name
    FROM [dbo].[Dim_tableA ] A
    INNER JOIN tableA1 A1
       ON A.[ParentId] = A1.[Id]
    WHERE NOT EXISTS (
                      SELECT *
                      FROM [dbo].[Dim_tableC] C
                      WHERE C.[ChildId] = A.[ParentId]
                      )
    GROUP BY A1.[Label], A.[ParentId]
    UNION ALL
    SELECT A.[ChildId] AS CountryId
         , H.[Data]
         , H.[Level] + 1 AS [Level]
         , CAST( H.[path_name] AS VARCHAR (MAX)) + CAST(H.[Data] AS VARCHAR(MAX))
    FROM [dbo].[Dim_table] A
    INNER JOIN H
       ON H.[CountryId] = A.[ParentId]
    )
     
    SELECT *
    FROM H
    order by H.path_name, CountryId
    Et un minimum d'indentation ça ne fait pas de mal
    Rejoignez la communauté du chat et partagez vos connaissances ou vos questions avec nous

    Mon Tutoriel pour apprendre les Agregations
    Consultez mon Blog SQL destiné aux débutants

    Pensez à FAQ SQL Server Ainsi qu'aux Cours et Tuto SQL Server

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2006
    Messages : 104
    Par défaut
    C'est le fait d'ajouter la concaténation avec le champs H.[Data] qui semble poser problème...

  6. #6
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 010
    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 010
    Billets dans le blog
    6
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CAST( H.[path_name] AS VARCHAR (MAX)) + CAST(H.[DATA] AS VARCHAR(MAX))
    récrivez :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    H.[path_name] + H.[DATA]
    si tant est que DATA soit du littéral.

    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/ * * * * *

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

Discussions similaires

  1. Requete pour définir une hierarchie
    Par teslaboy dans le forum WinDev
    Réponses: 5
    Dernier message: 21/02/2008, 14h32
  2. Requete pour un top 3!
    Par faayy dans le forum Access
    Réponses: 6
    Dernier message: 20/06/2005, 09h06
  3. Requete pour un débutant
    Par sqlnoob dans le forum Langage SQL
    Réponses: 3
    Dernier message: 20/05/2005, 08h55
  4. requete pour reccuperer une parti d'un resultat
    Par ViBy dans le forum Langage SQL
    Réponses: 6
    Dernier message: 03/09/2004, 09h33
  5. requete pour avoir CONTENU procedures stockees
    Par bmayer dans le forum MS SQL Server
    Réponses: 11
    Dernier message: 11/02/2004, 13h20

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