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 :

Fonction de fenêtrage [2008R2]


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Octobre 2006
    Messages
    316
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 316
    Par défaut Fonction de fenêtrage
    Bonjour,

    Etant en SQL 2008R2, je cherche une alternative à "ORDER BY" de la fonction de fenêtrage ci-dessous.
    Ceci dans l'objectif de calculer les salaires en cumulé.


    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
    SELECT salaire, sum(salaire) OVER (ORDER BY salaire) FROM salaireemp;
     
     salaire|  sum  
    --------+-------
       3500 |  3500
       3900 |  7400
       4200 | 11600
       4500 | 16100
       4800 | 25700
       4800 | 25700
       5000 | 30700
       5200 | 41100
       5200 | 41100
       6000 | 47100
    (10 rows)
    Merci pour votre aide.

  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
    Par défaut
    Bonjour,

    Malheureusement, il n'y a pas d'alternative réellement efficace.
    Vous pouvez faire une sous requête scalaire corrélée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT 
    	A.salaire,
    	(
    		SELECT SUM(B.Salaire)
    		FROM salaireemp B
    		WHERE B.salaire <= A.salaire
    	)
    FROM salaireemp A
    Ou bien une autojointure avec regroupement si vous disposez d'une colonne discriminante pour les doublons sur les salaires (comme un id d'employé par exemple), mais je pense que dans ce cas, les performances ne seront pas réellement meilleures... a tester.
    Avez-vous une forte volumétrie ?

    dans tous les cas, pensez à indexer sur la colonne salaire.

  3. #3
    Membre éclairé
    Inscrit en
    Octobre 2006
    Messages
    316
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 316
    Par défaut
    Je vous donne la requête dans son intégralité. L'exemple précédent était factice, c'était juste pour expliquer l'énoncé.

    J'ai donc besoin de calculer la colonne DEL en cumulée et je ne trouve pas de solution. Point de vue volume, c'est environ 15000 lignes au total.

    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
    select Vga.U
            , Vga.Dateref
            , Vga.Micro
            , Vga.JL
            , Vga.IGA
            , Vga.SGA
            , val.DEL
            , val.REB
    	,SUM(val.del) OVER(PARTITION BY Vga.IGA) as Del_TT
     
    from vgamme Vga
     
    inner join Valloue Val
    on val.dateref = Vga.dateref 
    and val.IGA = Vga.IGA
    And Val.micro = Vga.micro
    and val.jl = Vga.Jl
    and val.U = Vga.U
    and val.grade = Vga.grade
     
    where Vga.grade = '1' and val.dateref = (Select Max(Dateref) from Vgamme)
     
    order by Micro, IGA, SGA, JL
    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    U	Dateref	                        Micro 	JL	IGA	SGA	DEL	REB	Del_TT
    5	2015-06-18 00:00:00.000	Q1040	CI	G00	020	0.5	0	17
    5	2015-06-18 00:00:00.000	Q1040	ML	G00	050	3.5	1.4	17
    5	2015-06-18 00:00:00.000	Q1040	FU	G00	080	2	0.6	17
    5	2015-06-18 00:00:00.000	Q1040	DP	G00	100	2	0.1	17
    5	2015-06-18 00:00:00.000	Q1040	F2	G00	130	2	2.7	17
    5	2015-06-18 00:00:00.000	Q1040	TB	G00	170	0.5	0	17
    5	2015-06-18 00:00:00.000	Q1040	RD	G00	190	1	0.4	17
    5	2015-06-18 00:00:00.000	Q1040	TF	G00	210	2	0	17
    5	2015-06-18 00:00:00.000	Q1040	SP	G00	230	1	0.3	17
    5	2015-06-18 00:00:00.000	Q1040	RF	G00	260	1	2.4	17
    5	2015-06-18 00:00:00.000	Q1040	RX	G00	290	1	3.5	17
    5	2015-06-18 00:00:00.000	Q1040	RH	G00	310	0	0	17
    5	2015-06-18 00:00:00.000	Q1040	EM	G00	330	0.5	0	17
    5	2015-06-18 00:00:00.000	Q1040	EX	G00	340	0	0	17
    5	2015-06-18 00:00:00.000	Q1040	CI	G01	020	0.5	0	17
    5	2015-06-18 00:00:00.000	Q1040	ML	G01	050	3.5	3	17
    5	2015-06-18 00:00:00.000	Q1040	FU	G01	080	2	3	17
    5	2015-06-18 00:00:00.000	Q1040	DP	G01	100	2	3	17
    5	2015-06-18 00:00:00.000	Q1040	F2	G01	130	2	3	17
    5	2015-06-18 00:00:00.000	Q1040	TB	G01	170	0.5	0	17
    5	2015-06-18 00:00:00.000	Q1040	RD	G01	190	1	3	17
    5	2015-06-18 00:00:00.000	Q1040	TF	G01	210	2	0	17
    5	2015-06-18 00:00:00.000	Q1040	SP	G01	230	1	3	17
    5	2015-06-18 00:00:00.000	Q1040	RF	G01	260	1	3	17
    5	2015-06-18 00:00:00.000	Q1040	RX	G01	290	1	4	17
    5	2015-06-18 00:00:00.000	Q1040	RH	G01	310	0	0	17
    5	2015-06-18 00:00:00.000	Q1040	EM	G01	330	0.5	4	17
    5	2015-06-18 00:00:00.000	Q1040	EX	G01	340	0	0	17

  4. #4
    Membre éclairé
    Inscrit en
    Octobre 2006
    Messages
    316
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 316
    Par défaut
    Je vois que personne n'a d'idée.. humm.. (?)
    Je cherche une solution depuis pas mal de temps et je tourne en rond, alors si qqun aperçoit une solution... Merci.

  5. #5
    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
    Par défaut
    Citation Envoyé par guilld Voir le message
    Je cherche une solution depuis pas mal de temps

    Je vous en ai proposé deux ! les avez vous testées ?
    sur une si faible volumétrie, avec les bon index, ça peut tout à fait convenir.

    Et en cas de problèmes de performances, la deuxième solution proposée pourrait faire l'objet d'une vue indexée, avec de fait des temps de réponses bien meilleures. (si le besoin est récurrents, et que les mises à jour des tables sous-jacentes ne sont pas trop fréquentes)

  6. #6
    Membre éclairé
    Inscrit en
    Octobre 2006
    Messages
    316
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 316
    Par défaut
    Effectivement, j'ai testé les 2 solutions et je vous en remercie. Mais le résultat est incohérent.

    Voici le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    select  
    		A.IGA
    		,A.DEL
    		,(
    			Select sum(B.DEL)
    			from #Dw_DelaiTravCumul B
    			where b.del <= A.del
    		) as x
     
    from #Dw_DelaiTravCumul A
    order by A.IGA, a.SGA
    et voici le 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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    IGA	DEL	x
    G00	0.5	17.5
    G00	3.5	215
    G00	2	191.5
    G00	2	191.5
    G00	2	191.5
    G00	0.5	17.5
    G00	1	118.5
    G00	2	191.5
    G00	1	118.5
    G00	1	118.5
    G00	1	118.5
    G00	0	0
    G00	0.5	17.5
    G00	0	0
    G01	0.5	17.5
    G01	3.5	215
    G01	2	191.5
    G01	2	191.5
    G01	2	191.5
    G01	0.5	17.5
    G01	1	118.5
    G01	2	191.5
    G01	1	118.5
    G01	1	118.5
    G01	1	118.5
    G01	0	0
    G01	0.5	17.5
    G01	0	0
    La colonne "X" étant celle qui devrait cumuler les sommes de "DEL" en rapport à "IGA", mais là je ne sais pas ce qui se produit!.
    Puis, quand "IGA" change de valeur, on doit repartir sur une nouvelle somme...
    Je tourne les noms de colonne dans tous les sens mais sans résultat.

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 12/02/2013, 01h08
  2. [Fenêtrage] Plusieurs fonctions d'agrégat pour un seul over
    Par Dominique49 dans le forum Requêtes
    Réponses: 2
    Dernier message: 06/03/2012, 18h46
  3. Implémentation des fonctions mathématiques
    Par mat.M dans le forum Mathématiques
    Réponses: 9
    Dernier message: 17/06/2002, 16h19
  4. fonction printf
    Par ydeleage dans le forum C
    Réponses: 7
    Dernier message: 30/05/2002, 11h24
  5. FOnction api specifiant la position de la souris
    Par florent dans le forum C++Builder
    Réponses: 4
    Dernier message: 15/05/2002, 20h07

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