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 :

besoin d'aide pour une requête


Sujet :

Développement SQL Server

Vue hybride

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

    Informations forums :
    Inscription : Janvier 2006
    Messages : 54
    Par défaut besoin d'aide pour une requête
    Bonjour, j'ai besoin d'aide pour la création d'une requête d'une procédure stockée.

    Voici la requête actuelle (je zappe les infos inutiles pour faire + claire) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    select Id_Action,  ..., Débit, Crédit, '0' As Total
    		from Actions where ... order by Id_Action ASC
    La requête renvoie 3 réponses :
    1. Débit = 0; Crédit = 50; Total = 0
    2. Débit = 0; Crédit = 25; Total = 0
    3. Débit = 75; Crédit = 0; Total = 0


    J'aimerais qu'elle renvoie :
    1. Débit = 0; Crédit = 50; Total = 50
    2. Débit = 0; Crédit = 25; Total = 75
    3. Débit = 75; Crédit = 0; Total = 0


    En gros : Total(LigneX) = Total(LigneX - 1) + Crédit - Débit
    Avec Total(LigneX - 1) = 0 quand LigneX - 1 existe pas

    J'ai essayé avec un curseur :
    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
    ALTER PROCEDURE [dbo].[Action_Select_All]
    AS
    BEGIN
    	declare @Id_Action int
    	declare @Débit real
    	declare @Crédit real
    	declare @Total real
    	declare @A_Total real
    	set @A_Total = 0
     
    	declare Curseur_Réponse cursor for
    	select Id_Action, ..., Débit, Crédit, '0' As Total
    		from Actions where ... order by Id_Action ASC
     
    	open Curseur_Réponse
    	if @@Cursor_Rows != 0
    	begin
    		--première ligne
    		fetch Curseur_Réponse into @Id_Action, ..., @Débit, @Crédit, @Total
    		set @Total = @A_Total + @Crédit - @Débit
    		--set Curseur_Réponse.Total = @Total
    		set @A_Total = @Total
     
    		while @@fetch_status = 0
    		begin
    			fetch Curseur_Réponse into @Id_Action, ..., @Débit, @Crédit, @Total
    			set @Total = @A_Total + @Crédit - @Débit
    			--set Curseur_Réponse.Total = @Total
    			set @A_Total = @Total
    			fetch Curseur_Réponse into @Id_Action, ..., @Débit, @Crédit, @Total
    		end
    	end
    	close Curseur_Réponse
    	deallocate Curseur_Réponse
    END
    Mais je ne sais pas encore utilisé les curseurs, je ne sais pas comment modifier les valeurs du curseurs et comment faire pour que la procédure stockée renvoie le select modifier.

    Merci d'avance

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Vous pouvez le faire en pur SQL.
    Voici un exemple :
    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
    WITH MaTable (Id_ligne, Debit, Credit) AS
    (
    select 1,  0, 50 union all
    select 2,  0, 25 union all
    select 3, 75,  0
    )
      select T1.Id_ligne, T1.Debit, T1.Credit,
             sum(T2.Credit - T2.Debit) as Total
        from MaTable as T1
             inner join MaTable as T2
               on T2.Id_ligne <= T1.Id_ligne
    group by T1.Id_ligne, T1.Debit, T1.Credit
    order by T1.Id_ligne asc;
     
    Id_ligne    Debit       Credit      Total
    ----------- ----------- ----------- -----------
    1           0           50          50
    2           0           25          75
    3           75          0           0

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 54
    Par défaut
    Après plusieurs tests, ca fonctionne parfaitement.

    Merci beaucoup

  4. #4
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut
    D'un point de vue purement théorique, cette solution (fonctionnelle sous Oracle) me semble bien plus adaptée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT P.NO_CLIENT,
                P.ANNEE, 
                P.MOIS,
                P.ID_SEQU,
                P.MONTANT,
    SUM(P.MONTANT) over (PARTITION BY NO_CLIENT ORDER BY P.ANNEE, P.MOIS, P.ID_SEQU ROWS UNBOUNDED PRECEDING ) AS SOMME_PARTIELLE
    FROM COMPTA P
    WHERE P.NO_CLIENT = :NO_CLIENT_SEL
    ORDER BY P.ANNEE, P.MOIS, P.ID_SEQU
    Source : http://www.developpez.net/forums/d43...if/#post316923
    (à adapter)

    Par contre, pour une raison inconnue, sous SQL Server 2008, je n'arrive absolument pas à mettre une clause "order by" dans mon partitionnement avec "sum()" ???? Limitation de SQL Server ou de moi ?

  5. #5
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    SQL Server 2005 / 2008 ne supporte pas la partie ORDER BY dans les agrégats analytiques.

    Sous Oracle j'aurai effectivement proposé cette solution, bien moins coûteuse.

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

Discussions similaires

  1. Besoin d'aide pour une requête de MAJ (modif. de car.)
    Par ptitscrat dans le forum Access
    Réponses: 5
    Dernier message: 22/03/2006, 17h27
  2. besoin d'aide pour une requête
    Par lipao17 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 04/01/2006, 16h55
  3. Besoin d'aide pour une requête SQL
    Par Borami dans le forum Langage SQL
    Réponses: 1
    Dernier message: 07/11/2005, 10h33
  4. Besoin d'aide pour une Requête SQL ...
    Par Kokito dans le forum Requêtes
    Réponses: 2
    Dernier message: 07/07/2004, 11h56
  5. besoin d'aide pour une requête
    Par Damien69 dans le forum Langage SQL
    Réponses: 11
    Dernier message: 31/03/2004, 15h38

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