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 :

Résultat d'une boucle sur une seule ligne


Sujet :

Développement SQL Server

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mars 2009
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 29
    Points : 11
    Points
    11
    Par défaut Résultat d'une boucle sur une seule ligne
    Bonjour,

    Pour une prévision de chiffre d'affaire je dois effectuer la répartition mensuelle du montant de contrats d'entretien. Cette prévision doit se faire pour une date variable et à un horizon variable n (typiquement 12 ou 18 mois).
    De par ce caractère variable et pour éviter de recopier n fois mon code, je souhaite utiliser un boucle (WHILE). Mais le résultat est logiquement un table de n lignes. Je souhaite le résultat en colonnes successives correspondant aux mois 1, 2, 3 ...n.

    Est-ce possible ? Comment procéder ?

    Merci de votre aide.

    Pour fixer les idées, le code d'un élément du code final. PrevDate = date origine de la prévision, IndexPériode = n (nombre de mois d'horizon), Ci = Date initiale du contrat, Cf = Date finale du contrat

    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
    USE [POWER_SBO]
    DECLARE @PrevDate Datetime
    DECLARE	@IndexPériode Int
    DECLARE @IndexBoucle Int
    DECLARE	@Ci Datetime
    DECLARE	@Cf Datetime
     
    SET @PrevDate = CONVERT (DATETIME, '01/01/2017', 103)
    SET @IndexPériode = 17
    SET @Ci = CONVERT (DATETIME, '15/03/2016', 103)
    SET @Cf = CONVERT (DATETIME, '14/03/2017', 103)
    SET @IndexBoucle = 0
     
    WHILE @IndexBoucle <= @IndexPériode
    BEGIN
    SELECT * FROM POWER_SBO.dbo.Rep_n(@PrevDate,@IndexBoucle,@Ci,@Cf)
    SET @IndexBoucle = @IndexBoucle + 1
    END

  2. #2
    Modérateur
    Avatar de kolodz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    2 211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 211
    Points : 8 316
    Points
    8 316
    Billets dans le blog
    52
    Par défaut
    Potentiellement deux sujets qui pourront t'aider :
    Requête SQL, transformer des lignes en colonne
    Requête pivot avec création d'une colonne "total"

    Cordialement,
    Patrick Kolodziejczyk.
    Si une réponse vous a été utile pensez à
    Si vous avez eu la réponse à votre question, marquez votre discussion
    Pensez aux FAQs et aux tutoriels et cours.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mars 2009
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 29
    Points : 11
    Points
    11
    Par défaut "Solution"
    Merci pour cette piste qui m'a conforté sur la piste de PIVOT et donné le courage, et ce n'est pas un mot en l'air, de la creuser.

    Après avoir étudié l'instruction et l'automatisation avec ces deux sources respectives :
    https://www.expert-only.com/microsof...ous-sql-server
    http://fadace.developpez.com/mssql/pivot/ (déjà citée dans la seconde référence suggérée)

    Je me suis lancé et si cela peut servir à ceux qui comme moi font dans l'auto-formation, voici mon bout de code qui fonctionne et me permet d'envisager la suite de mon développement :

    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
     
    USE [POWER_SBO]
    DECLARE @PrevDate Datetime
    DECLARE	@IndexPériode Int
    DECLARE @IndexBoucle Int
    DECLARE	@Ci Datetime
    DECLARE	@Cf Datetime
     
    --DECLARE @LOOPOUT TABLE 
    --( 
    --  PrevMonth VARCHAR(25), NBJ INT -- La variable table ne passe pas à dans l'exec() => Utilisation d'une vrai table 
    --)
     
    SET @PrevDate = CONVERT (DATETIME, '01/01/2017', 103)
    SET @IndexPériode = 17
    SET @Ci = CONVERT (DATETIME, '15/03/2016', 103)
    SET @Cf = CONVERT (DATETIME, '14/03/2017', 103)
    SET @IndexBoucle = 0
     
    DELETE FROM dbo.LOOPOUT
     
    WHILE @IndexBoucle <= @IndexPériode
    BEGIN
    INSERT INTO LOOPOUT SELECT * FROM POWER_SBO.dbo.Rep_n(@PrevDate,@IndexBoucle,@Ci,@Cf)
    SET @IndexBoucle = @IndexBoucle + 1
    END
     
    --SELECT * FROM LOOPOUT
     
    DECLARE col_cursor CURSOR FOR SELECT PrevMonth FROM LOOPOUT
    DECLARE @col nvarchar(25), @col_concat nvarchar(1000), @pivot_in nvarchar(1000), @sql nvarchar(1000)
    SELECT @col_concat = '', @sql = ''
     
    OPEN col_cursor
    FETCH col_cursor INTO @col
    WHILE @@FETCH_STATUS = 0
    	BEGIN
    	SELECT @col_concat = @col_concat + '['+ @col +'], ' 
    	FETCH col_cursor INTO @col
    	END
    CLOSE col_cursor
    DEALLOCATE col_cursor
     
    SELECT @pivot_in = LEFT(@col_concat, LEN(@col_concat)-1)
    SELECT @col_concat = '''Valeur''' + ' AS [Mois], ' + @col_concat
    SELECT @col_concat = LEFT(@col_concat, LEN(@col_concat)-1)
     
    --SELECT @col_concat -- Visu de contrôle
    --SELECT @pivot_in   -- Visu de contrôle
     
    SELECT @sql = 'SELECT ' + @col_concat +
    'FROM LOOPOUT
    PIVOT (AVG(NBJ)
    FOR PrevMonth IN (' + @pivot_in + ')) AS Row_As_Line'
     
    exec(@sql)

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

Discussions similaires

  1. Comparaison deux cellules d'une même ligne sur une boucle d'une plage
    Par Hocked dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 08/09/2015, 12h51
  2. Écrire le résultat d'une boucle sur une ligne
    Par Erlen dans le forum Shell et commandes GNU
    Réponses: 9
    Dernier message: 03/05/2012, 15h18
  3. Revenir sur une liste sur la bonne ligne
    Par helios399 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 1
    Dernier message: 15/11/2011, 03h46
  4. [XSLT] Faire une boucle sur une variable [i]
    Par PoT_de_NuTeLLa dans le forum XSL/XSLT/XPATH
    Réponses: 8
    Dernier message: 07/06/2010, 12h45
  5. une colle sur une boucle
    Par blastfr dans le forum SAS Base
    Réponses: 6
    Dernier message: 27/04/2010, 15h19

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