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

Langage SQL Discussion :

Somme des X premières lignes


Sujet :

Langage SQL

  1. #1
    Membre éclairé Avatar de PrinceCorwin
    Homme Profil pro
    Responsable d'un système d'information métier
    Inscrit en
    Mars 2012
    Messages
    337
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Responsable d'un système d'information métier
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2012
    Messages : 337
    Points : 692
    Points
    692
    Par défaut Somme des X premières lignes
    Bonjour,

    Je débute avec le requétage SQL, et je suis déjà confronté à un problème.
    Dans la base de données j'ai deux tables : articles et historique mouvements.

    structure de la table article:
    ITMREF a(25)

    structure de la table mouvements :
    ITMREF a(25)
    EXERCICE c(2)
    PERIODE c(2)
    MONTANTPERIODE dcb(13.5)

    extrait de la table des mouvements
    ITMREF_0 FIYNUM_0 PERNUM_0 MONISSAMT_0
    CON1020 2 6 0
    CON1020 2 9 -7,98
    CON1020 3 3 -7,98
    CON1020 2 11 -7,98
    CON1020 3 9 -97,6996
    CON1020 3 1 -7,98
    CON1020 3 7 -165,3707
    CON1020 3 5 -7,98
    CON1020 4 8 -24,3003
    CON1020 3 6 0
    CON1020 3 8 -55,1974
    CON1020 3 10 -47,3773
    CON1020 4 11 -26,741
    CON1020 4 3 -12,0328
    CON1020 4 5 -12,1892
    CON1020 4 7 -2,8636
    CON1020 4 6 -26,3337
    CON1020 4 10 -45,0732
    CON1020 4 9 -0,3068
    CON1020 4 12 -2,2051
    CON1020 5 2 -1,4418
    CON1020 5 1 -1,5268



    La question :
    je souhaite, pour chaque articles de la table article, avoir un cumul des 7 premiers mouvements classés dans l'ordre : article, exercice desc, période desc.
    J'en suis à ce niveau
    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
     
    SELECT 
    	ITM.ITMREF_0,
    	MV2.CUMISSAMT_0
     
    FROM 
    	ITMMASTER ITM
    	LEFT OUTER JOIN (SELECT
    			A.ITMREF_0,
    			A.FIYNUM_0,
    			A.PERNUM_0,
    			A.MONISSAMT_0,
    			ROW_NUMBER() OVER (PARTITION BY A.ITMREF_0 ORDER BY A.ITMREF_0, A.FIYNUM_0 DESC, A.PERNUM_0 DESC) AS RN,
    			SUM(A.MONISSAMT_0) OVER (PARTITION BY A.ITMREF_0) AS CUMISSAMT_0
    		FROM 
    			ITMMVTHIS A
    		) MV2 ON 
    		MV2.ITMREF_0=ITM.ITMREF_0
    WHERE
    	MV2.RN < 8
    mais je bloque pour n'afficher qu'une seule ligne et pour ne prendre en compte QUE les 7 lignes du haut
    ITMREF_0 CUMISSAMT_0
    CON1020 -560,5593
    CON1020 -560,5593
    CON1020 -560,5593
    CON1020 -560,5593
    CON1020 -560,5593
    CON1020 -560,5593
    CON1020 -560,5593




    Résultat attendu serait :
    ITMREF_0 CUMISSAMT_0
    CON1020 101,595


    Bien sûr, il se peut qu'un article n'est pas plus de 3 historiques dans les mouvements.
    Sachant que je souhaite avoir les 7 derniers historiques, il faut tout de même faire le cumul de ces 1, ou 2, ou 6 lignes...

    Si vous avez un peu de temps pour m'aider à résoudre ce mystère...
    Vous remerciant par avance pour toutes vos suggestions.

    Merci JCB
    Si ce message vous a aidé, appuyez sur le petit , ca fait toujours plaisir
    Merci.

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 909
    Points
    38 909
    Billets dans le blog
    9
    Par défaut
    Si votre SGBD le permet (pas MySQL ni ACCESS par exemple), utilisez une fonction de fenêtrage dans une CTE avec row_number
    Puis lisez votre CTE en groupant sur vos critères et en filtrant sur Row_number < 8

  3. #3
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 909
    Points
    38 909
    Billets dans le blog
    9
    Par défaut
    Ce qui donne grosso modo (à tester)

    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
    With MyCTE as (
        (SELECT ITMREF_0,
                FIYNUM_0,
                PERNUM_0,
                MONISSAMT_0,
                ROW_NUMBER()
                    OVER (PARTITION BY ITMREF_0 ORDER BY ITMREF_0, FIYNUM_0 DESC, PERNUM_0 DESC) AS RN,
         FROM ITMMVTHIS
        )
    Select ITMREF_0,
           FIYNUM_0,
           PERNUM_0,
           sum(monissamt_0)
    from MyCTE
    where RN < 8
    Group by ITMREF_0,
             FIYNUM_0,
             PERNUM_0

  4. #4
    Membre éclairé Avatar de PrinceCorwin
    Homme Profil pro
    Responsable d'un système d'information métier
    Inscrit en
    Mars 2012
    Messages
    337
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Responsable d'un système d'information métier
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2012
    Messages : 337
    Points : 692
    Points
    692
    Par défaut
    Bonjour Monsieur escartefigue,

    Votre proposition fonctionne parfaitement ! et je vous en remercie.
    Je fais un requête MS SQL pour sortir dans Excel une liste d'articles avec certaines informations.

    Mais je ne vois pas comment je pourrais l'intégrer dans ma requête SQL...
    Il s'agirait de remplacer le sous-lien MV2 par
    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
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    SELECT DISTINCT 
    	ITM.ITMREF_0 as 'Ref article',
    	MV1.YEAISSAMT_0 as 'Mnt OUT N-1',
    	MV1.YEAISSMVT_0 as 'Mvt OUT N-1',
    	MV1.YEAISSQTY_0 as 'Qté OUT N-1',
    	MV1.YEARCPAMT_0 as 'Mnt IN N-1',
    	MV1.YEARCPMVT_0 as 'Mvt IN N-1',
    	MV1.YEARCPQTY_0 as 'Qté IN N-1',
    	MV2.CUMISSAMT_0 as 'Mnt OUT 7 mois',
    	MV2.CUMISSMVT_0 as 'Mvt OUT 7 mois',
    	MV2.CUMISSQTY_0 as 'Qté OUT 7 mois',
    	MV2.CUMRCPAMT_0 as 'Mnt IN 7 mois',
    	MV2.CUMRCPMVT_0 as 'Mvt IN 7 mois',
    	MV2.CUMRCPQTY_0 as 'Qté IN 7 mois',
    	MV3.CUMISSAMT_0 as 'Mnt OUT mois N',
    	MV3.CUMISSMVT_0 as 'Mvt OUT mois N',
    	MV3.CUMISSQTY_0 as 'Qté OUT mois N',
    	MV3.CUMRCPAMT_0 as 'Mnt IN mois N',
    	MV3.CUMRCPMVT_0 as 'Mvt IN mois N',
    	MV3.CUMRCPQTY_0 as 'Qté IN mois N',
    	MV4.YEAISSAMT_0 as 'Mnt OUT N',
    	MV4.YEAISSMVT_0 as 'Mvt OUT N',
    	MV4.YEAISSQTY_0 as 'Qté OUT N',
    	MV4.YEARCPAMT_0 as 'Mnt IN N',
    	MV4.YEARCPMVT_0 as 'Mnt IN N',
    	MV4.YEARCPQTY_0 as 'Qté IN N'
     
    FROM
    	ITMMASTER ITM
    	LEFT OUTER JOIN (SELECT 
    			 A.ITMREF_0,
    			 A.FIYNUM_0,
    			 A.PERNUM_0,
    			 A.YEAISSAMT_0,
    			 A.YEAISSMVT_0,
    			 A.YEAISSQTY_0,
    			 A.YEARCPAMT_0,
    			 A.YEARCPMVT_0,
    			 A.YEARCPQTY_0
    		FROM
    			 ITMMVTHIS A) MV1 ON 
    		MV1.ITMREF_0 = ITM.ITMREF_0 AND 
    		MV1.FIYNUM_0 = 4 AND 
    		MV1.PERNUM_0 = 12
    			LEFT OUTER JOIN ( SELECT DISTINCT
    			A.ITMREF_0,
    			A.FIYNUM_0,
    			A.PERNUM_0,
    			SUM(A.MONISSAMT_0) OVER (PARTITION BY A.ITMREF_0) AS CUMISSAMT_0,
    			SUM(A.MONISSMVT_0) OVER (PARTITION BY A.ITMREF_0) AS CUMISSMVT_0,
    			SUM(A.MONISSQTY_0) OVER (PARTITION BY A.ITMREF_0) AS CUMISSQTY_0,
    			SUM(A.MONRCPAMT_0) OVER (PARTITION BY A.ITMREF_0) AS CUMRCPAMT_0,
    			SUM(A.MONRCPMVT_0) OVER (PARTITION BY A.ITMREF_0) AS CUMRCPMVT_0,
    			SUM(A.MONRCPQTY_0) OVER (PARTITION BY A.ITMREF_0) AS CUMRCPQTY_0
    		FROM ITMMVTHIS A ) MV2 ON 
    		MV2.ITMREF_0=ITM.ITMREF_0
    	LEFT OUTER JOIN ( SELECT DISTINCT
    			A.ITMREF_0,
    			A.FIYNUM_0,
    			A.PERNUM_0,
    			SUM(A.MONISSAMT_0) OVER (PARTITION BY A.ITMREF_0) AS CUMISSAMT_0,
    			SUM(A.MONISSMVT_0) OVER (PARTITION BY A.ITMREF_0) AS CUMISSMVT_0,
    			SUM(A.MONISSQTY_0) OVER (PARTITION BY A.ITMREF_0) AS CUMISSQTY_0,
    			SUM(A.MONRCPAMT_0) OVER (PARTITION BY A.ITMREF_0) AS CUMRCPAMT_0,
    			SUM(A.MONRCPMVT_0) OVER (PARTITION BY A.ITMREF_0) AS CUMRCPMVT_0,
    			SUM(A.MONRCPQTY_0) OVER (PARTITION BY A.ITMREF_0) AS CUMRCPQTY_0
    		FROM ITMMVTHIS A 
    		WHERE 
    			A.FIYNUM_0=5 AND 
    			A.PERNUM_0=1 ) MV3 ON 
    		MV3.ITMREF_0=ITM.ITMREF_0
    	LEFT OUTER JOIN (SELECT 
    			 A.ITMREF_0,
    			 A.FIYNUM_0,
    			 A.PERNUM_0,
    			 A.YEAISSAMT_0,
    			 A.YEAISSMVT_0,
    			 A.YEAISSQTY_0,
    			 A.YEARCPAMT_0,
    			 A.YEARCPMVT_0,
    			 A.YEARCPQTY_0
    		FROM
    			 ITMMVTHIS A) MV4 ON 
    		MV4.ITMREF_0 = ITM.ITMREF_0 AND 
    		MV4.FIYNUM_0 = 5 AND 
    		MV4.PERNUM_0 = 2
    Merci pour votre aide inestimable.

    Signé JCB
    Si ce message vous a aidé, appuyez sur le petit , ca fait toujours plaisir
    Merci.

  5. #5
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 909
    Points
    38 909
    Billets dans le blog
    9
    Par défaut
    Bonsoir,

    Je ne suis pas certain d'avoir bien compris votre besoin, mais si la requete que vous présentez doit valoriser le résultat de la requete imbriquée dont l'alias est mv2, pourquoi ne pas construire une 2ème CTE pour construire le sous-ensemble dont vous avez besoin ?

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

Discussions similaires

  1. [DI] Extraction des 20 premières lignes d'une table SAS
    Par garciat dans le forum Outils BI
    Réponses: 2
    Dernier message: 27/05/2015, 10h12
  2. [XL-2003] Figé les volets des 2 premières lignes
    Par pikameuh dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 16/06/2011, 12h28
  3. Print des 600 premières lignes d'un Fichier
    Par AAWOOPY56 dans le forum AIX
    Réponses: 2
    Dernier message: 02/08/2010, 12h08
  4. somme des effectifs de lignes excel via VBA
    Par soul330 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 05/07/2010, 20h42
  5. Problème d'affichage des X premières lignes d'une requête
    Par TheFlow dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 22/07/2008, 09h44

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