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

SQL Oracle Discussion :

Différence 2 lignes par 2


Sujet :

SQL Oracle

  1. #1
    Membre très actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2018
    Messages
    494
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2018
    Messages : 494
    Par défaut Différence 2 lignes par 2
    j'ai besoin de sommer les lignes de ma table de la manière suivant

    DATE --- REF --- MONTANT --- INDICE --- TOTAL_IND_1 --- TOTAL_IND_2 --- DIFF

    avec INDICE in (1,2)

    pour chaque REF j'ai besoin besoin de faire la différence : DIFF = (MONTANT where INDICE = 1 ) - (MONTANT where INDICE = 2) et mettre le résultant dans la ligne courante ( pratiquement je dois avoir des 0 pour la majorité des lignes)

    d'un autre lieu j'ai besoin de retourner la 1ere date ou DIFF <> 0

    merci pour vos collaborations

  2. #2
    Membre éprouvé
    Avatar de Sunchaser
    Homme Profil pro
    OPNI (Objet Programmant Non Identifié)
    Inscrit en
    Décembre 2004
    Messages
    2 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : OPNI (Objet Programmant Non Identifié)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 059
    Par défaut
    Bonjour,

    Une idée qui me passe par la tête serait de faire un LAG sur montant (surement partition by ref), pour les lignes ayant indice = 2.
    Comme ca, tu peux faire ton opération sur les montants.

    @+


    PS: sinon, je crains que tu doives préparer qq données de tests, et les poster, etc ...

  3. #3
    Membre Expert
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Février 2012
    Messages
    650
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Distribution

    Informations forums :
    Inscription : Février 2012
    Messages : 650
    Par défaut
    Il y a plusieurs solutions, tu pourrais faire des sous-requêtes pour obtenir le montant par REF du cumul de l'indice 1 et le cumul de l'indice 2.

    Une solution pour faire le cumul en une seule requête (A adapter pour ton contexte)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SELECT REF, Total_IND1, Total_IND2, 
      Total_IND1 - Total_IND2 AS Diff
    FROM
      (SELECT REF, 
        SUM(DECODE(IND,1,MONTANT,0)) AS Total_IND1, 
        SUM(DECODE(IND,2,MONTANT,0)) AS Total_IND2, 
      FROM MaTable
      WHERE IND IN (1,2)
      GROUP BY REF
      );

  4. #4
    Membre très actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2018
    Messages
    494
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2018
    Messages : 494
    Par défaut
    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
    DATE	  MONTANT	INDICE	REF	TOTAL_IND_1	TOTAL_IND_2	
    28/09/2014	1470,03	1	6001858	-1470,03	0	0	
    07/10/2014	1470,03	2	6001858	0	1470,03	0	
    29/03/2015	2000	1	6001858	-2000	0	0	
    21/04/2015	2000	2	6001858	0	2000	0	
    28/03/2017	5000	1	6001858	-5000	0	0	
    12/04/2017	5000	2	6001858	0	5000	0	
    28/06/2017	5000	1	6001858	-5000	0	0	  ----- JE DOIS AFFICHER '28/06/2017'
    28/09/2017	5000	1	6001858	-5000	0	0	
    28/12/2017	5000	1	6001858	-5000	0	0	
    28/03/2018	5000	1	6001858	-5000	0	0	
    22/05/2018	5000	2	6001858	0	5000	0
     
     
    29/12/2013	1694,63	1	6001859	-1694,63	0	0	
    13/01/2014	1694,63	2	6001859	0	1694,63	0	
    28/09/2014	2000	1	6001859	-2000	0	0	
    07/10/2014	2000	2	6001859	0	2000	0	
    28/12/2014	1171,09	1	6001859	-1171,09	0	0	
    01/02/2015	1171,09	2	6001859	0	1171,09	0	
    29/03/2015	2000	1	6001859	-2000	0	0	
    21/04/2015	2000	2	6001859	0	2000	0	
    28/03/2017	5000	1	6001859	-5000	0	0	
    12/04/2017	5000	2	6001859	0	5000	0	
    28/06/2017	5000	1	6001859	-5000	0	0		-- IDEM 28/06/2017	
    28/09/2017	5000	1	6001859	-5000	0	0	
    28/12/2017	5000	1	6001859	-5000	0	0	
    28/03/2018	5000	1	6001859	-5000	0	0	
    22/05/2018	2475,09	2	6001859	0	2475,09	0
     
     
     
    16/04/2012	4612,69	1	6001942	-4612,69	0	0	
    30/04/2012	4612,69	2	6001942	0	4612,69	0	
    16/01/2013	1981,29	1	6001942	-1981,29	0	0	
    27/01/2013	1981,29	2	6001942	0	1981,29	0	
    16/07/2014	2316,88	1	6001942	-2316,88	0	0	
    27/07/2014	2316,88	2	6001942	0	2316,88	0	
    18/01/2015	4612,69	1	6001942	-4612,69	0	0	
    01/02/2015	4612,69	2	6001942	0	4612,69	0	
    16/04/2015	4612,69	1	6001942	-4612,69	0	0	
    21/04/2015	4612,69	2	6001942	0	4612,69	0	
    16/07/2017	5000	1	6001942	-5000	0	0		----  je dois afficher  16/07/2017	
    16/10/2017	5000	1	6001942	-5000	0	0	
    16/01/2018	5000	1	6001942	-5000	0	0	
    16/04/2018	5000	1	6001942	-5000	0	0	
    16/07/2018	5000	1	6001942	-5000	0	0	
    16/10/2018	5000	1	6001942	-5000	0	0	
    16/01/2019	5000	1	6001942	-5000	0	0

  5. #5
    Membre très actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2018
    Messages
    494
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2018
    Messages : 494
    Par défaut
    Citation Envoyé par Scriuiw Voir le message
    Il y a plusieurs solutions, tu pourrais faire des sous-requêtes pour obtenir le montant par REF du cumul de l'indice 1 et le cumul de l'indice 2.

    Une solution pour faire le cumul en une seule requête (A adapter pour ton contexte)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SELECT REF, Total_IND1, Total_IND2, 
      Total_IND1 - Total_IND2 AS Diff
    FROM
      (SELECT REF, 
        SUM(DECODE(IND,1,MONTANT,0)) AS Total_IND1, 
        SUM(DECODE(IND,2,MONTANT,0)) AS Total_IND2, 
      FROM MaTable
      WHERE IND IN (1,2)
      GROUP BY REF
      );
    c'est juste mais ici je dois récupérer la date ou la différence est <> 0, donc tant que la différence = 0 je continue

  6. #6
    Membre Expert
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Février 2012
    Messages
    650
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Distribution

    Informations forums :
    Inscription : Février 2012
    Messages : 650
    Par défaut
    Je ne comprend pas l'exemple, pourquoi faut-il afficher 28/06/2017 ?

  7. #7
    Membre très actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2018
    Messages
    494
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2018
    Messages : 494
    Par défaut
    Citation Envoyé par Scriuiw Voir le message
    Je ne comprend pas l'exemple, pourquoi faut-il afficher 28/06/2017 ?
    parceque mes lignes marche deux - à deux, donc chaque Ligne avec INDICE = 1 pour le même montant elle doit retrouver la même ligne pour INDICE = 2 ce qui fait lorsque on somme on obtient = 0

    dans le cas ou on trouvera pas d'INDICE 2 juste après 1 pour le même montant on doit récupérer la date de cette ligne

  8. #8
    Membre très actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2018
    Messages
    494
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2018
    Messages : 494
    Par défaut
    Citation Envoyé par LandGreen Voir le message
    parceque mes lignes marche deux - à deux, donc chaque Ligne avec INDICE = 1 pour le même montant elle doit retrouver la même ligne pour INDICE = 2 ce qui fait lorsque on somme on obtient = 0

    dans le cas ou on trouvera pas d'INDICE 2 juste après 1 pour le même montant on doit récupérer la date de cette ligne

    lorsque on soustraire*

  9. #9
    Membre Expert
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Février 2012
    Messages
    650
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Distribution

    Informations forums :
    Inscription : Février 2012
    Messages : 650
    Par défaut
    Vois du côté des fonctions analytique LEAD et LAG dans ce cas pour pouvoir contrôler les lignes avant/après de ta requête

  10. #10
    Membre Expert
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Février 2012
    Messages
    650
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Distribution

    Informations forums :
    Inscription : Février 2012
    Messages : 650
    Par défaut
    Vu que ça n'a pas l'air de t'inspirer plus que cela, voici un exemple qu'il faudra certainement adapter à tes propres critères (Notamment la soustraction des montants pour ne prendre que les lignes en différence de montant et de bascule d'indice 1/2) :

    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
     
    SELECT DATE, REF, INDICE, Total_IND1, Total_IND2, Prev_INDICE, Next_INDICE
    FROM
      (SELECT DATE, REF, INDICE, Total_IND1, Total_IND2, 
        LAG(INDICE) OVER(PARTITION BY 1 ORDER BY DATE, REF, INDICE) AS Prev_INDICE,
        LEAD(INDICE) OVER(PARTITION BY 1 ORDER BY DATE, REF, INDICE) AS Next_INDICE
      FROM
        (SELECT DATE, REF, INDICE,
          SUM(DECODE(IND,1,MONTANT,0)) AS Total_IND1, 
          SUM(DECODE(IND,2,MONTANT,0)) AS Total_IND2, 
        FROM MaTable
        WHERE IND IN (1,2)
        GROUP BY DATE, REF, INDICE
        )
      )
    WHERE INDICE <> Prev_INDICE
    AND INDICE = Next_INDICE;

  11. #11
    Membre éprouvé
    Avatar de Sunchaser
    Homme Profil pro
    OPNI (Objet Programmant Non Identifié)
    Inscrit en
    Décembre 2004
    Messages
    2 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : OPNI (Objet Programmant Non Identifié)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 059
    Par défaut
    Bonjour,

    @Scriuiw: j'ai failli poster un truc similaire hier, puis je me suis ravisé en laissant le loisir à LandGreen le loisir de "lagger" - puisque dans ce cas, il ne risque pas de se faire kicker ... petit clin d'oeil aux gamers .@+

    @+

  12. #12
    Membre Expert
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Février 2012
    Messages
    650
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Distribution

    Informations forums :
    Inscription : Février 2012
    Messages : 650
    Par défaut


    Lorsque l'on débute en SQL, les fonctions analytiques ce n'est pas ce qu'il y a de plus abordables alors que ça solutionne facilement des situations "compliquées".
    Donc un petit coup de pouce sur la construction, ne reste plus qu'à jouer avec après pour obtenir le bon résultat

  13. #13
    Membre très actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2018
    Messages
    494
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2018
    Messages : 494
    Par défaut
    Scriuiw & Sunchaser Mes remerciements les plus sincères! vous m'avez trop aider

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

Discussions similaires

  1. Détection par bloc et différence ligne par ligne
    Par peter_k dans le forum OpenCV
    Réponses: 1
    Dernier message: 23/04/2013, 11h24
  2. Parcourir un Db_GRID ligne par ligne
    Par sanosuke dans le forum Bases de données
    Réponses: 8
    Dernier message: 12/05/2008, 12h14
  3. aditionner les champs d'une table ligne par ligne
    Par bertrand_declerck dans le forum Bases de données
    Réponses: 3
    Dernier message: 09/08/2005, 08h38
  4. remplacer des sauts de ligne par '\n'
    Par Miksimus dans le forum Général Python
    Réponses: 5
    Dernier message: 18/07/2005, 10h01

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