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 :

Calculs sur Recursivité


Sujet :

Développement SQL Server

  1. #1
    Membre du Club
    Inscrit en
    Mars 2009
    Messages
    87
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 87
    Points : 44
    Points
    44
    Par défaut Calculs sur Recursivité
    Bonjour à tous,

    Voici donc mon problème. J'ai une récursivité sur ma table produit et je voudrai savoir de combien de noeuds se compose un produit.
    Je pense qu'une CTE résoudrai assez simplement cette exercice mais je bloque

    Jeu de test:
    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
     
    declare @Prod TABLE (IdProd int, IdProdPere int)
     
    INSERT INTO @Prod (IdProd, IdProdPere) VALUES (1,NULL)
    INSERT INTO @Prod (IdProd, IdProdPere) VALUES (2,NULL)
    INSERT INTO @Prod (IdProd, IdProdPere) VALUES (3,1)
    INSERT INTO @Prod (IdProd, IdProdPere) VALUES (4,NULL)
    INSERT INTO @Prod (IdProd, IdProdPere) VALUES (5,3)
    INSERT INTO @Prod (IdProd, IdProdPere) VALUES (6,NULL)
    INSERT INTO @Prod (IdProd, IdProdPere) VALUES (7,2)
    INSERT INTO @Prod (IdProd, IdProdPere) VALUES (8,NULL)
    INSERT INTO @Prod (IdProd, IdProdPere) VALUES (9,NULL)
    INSERT INTO @Prod (IdProd, IdProdPere) VALUES (10,9)
    INSERT INTO @Prod (IdProd, IdProdPere) VALUES (11,10)
    INSERT INTO @Prod (IdProd, IdProdPere) VALUES (12,NULL)
    INSERT INTO @Prod (IdProd, IdProdPere) VALUES (13,11)
     
    SELECT * FROM @Prod
    Le résultat souhaité est le suivant :
    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
    IdProd Qte
    ------ ---
         1   0
         2   0
         3   1
         4   0
         5   2
         6   0
         7   1
         8   0
         9   0
        10   1
        11   2
        12   0
        13   3

  2. #2
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour


    essayez ceci :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    ;WITH CTE (IdProd, NbParent) AS(
    	SELECT idProd, 0
    	FROM @Prod
    	WHERE IdProdPere IS NULL
    	UNION ALL
    	SELECT P.IdProd, NbParent + 1
    	FROM @Prod AS P
    	INNER JOIN CTE ON CTE.IDProd = P.IDProdPere
    )
    SELECT * 
    FROM CTE
    ORDER BY IDProd

  3. #3
    Membre du Club
    Inscrit en
    Mars 2009
    Messages
    87
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 87
    Points : 44
    Points
    44
    Par défaut
    Superbe, merci beaucoup

    Si ça n'est pas abusé, j'ai homis qu'il me fallait une dernière donnée.

    Dans une 3ème colonne, il me faudrai l'IdProdOrigine:

    Résultat:


    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
    IdProd NbParent IdProdOrigine
    ------ -------- -------------
         1        0             0
         2        0             0
         3        1             1
         4        0             0
         5        2             1
         6        0             0
         7        1             2
         8        0             0
         9        0             0
        10        1             9
        11        2             9
        12        0             0
        13        3             9

  4. #4
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Avec ceci alors :

    Code sql : 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
     
    ;WITH CTE (IdProd, NbParent, IDProdOrigine) AS(
    	SELECT idProd, 0, idProd
    	FROM @Prod
    	WHERE IdProdPere IS NULL
    	UNION ALL
    	SELECT P.IdProd, NbParent + 1, CTE.IdProdOrigine
    	FROM @Prod AS P
    	INNER JOIN CTE ON CTE.IDProd = P.IDProdPere
    )
    SELECT 
    	idProd, 
    	NbParent, 
    	CASE IDProdOrigine 
    		WHEN idProd THEN 0 
    		ELSE IDProdOrigine 
    	END AS IDProdOrigine
    FROM CTE
    ORDER BY IDProd

  5. #5
    Membre du Club
    Inscrit en
    Mars 2009
    Messages
    87
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 87
    Points : 44
    Points
    44
    Par défaut
    Un grand MERCI !

    Ce travail ensembliste va sauver mon pauvre serveur SQL !

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

Discussions similaires

  1. Calcul sur requete
    Par nicoolas dans le forum Access
    Réponses: 3
    Dernier message: 11/01/2005, 16h50
  2. [débutant] calcul sur date
    Par Regis.C dans le forum Collection et Stream
    Réponses: 9
    Dernier message: 04/01/2005, 10h51
  3. Resutlat de calcul sur date formaté
    Par neness dans le forum SQL
    Réponses: 6
    Dernier message: 16/06/2004, 15h34
  4. Calcul sur date
    Par Thomad dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 17/09/2003, 08h55
  5. Réponses: 4
    Dernier message: 15/12/2002, 04h19

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