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

MS SQL Server Discussion :

Sommes sur 2 colonnes avec conditions


Sujet :

MS SQL Server

  1. #1
    Membre du Club
    Homme Profil pro
    web entrepreneur
    Inscrit en
    Novembre 2012
    Messages
    117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations professionnelles :
    Activité : web entrepreneur
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2012
    Messages : 117
    Points : 67
    Points
    67
    Par défaut Sommes sur 2 colonnes avec conditions
    Bonjour,

    Je galère pour trouver le moyen de faire ce type de calcul :

    Pour la sélection (SEL_ID) 987 par exemple je voudrais trouver la valeur correspondante à :

    la valeur de la colonne A du SEL_ID en question + la somme de toutes les valeurs de la colonne B autre que SEL_ID 987... et par contre égale au même MAR_ID (1234) ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    MAR_ID   SEL_ID    COL_A      COL_B                    
    ------  --------  --------  -----------         
     1234  	987    	    2		-4  
     1234  	786    	   -5	  	 6
     1234  	654    	   10	  	-7
     2345   ....
     2345   ...
    Suivant cet exemple pour SEL_ID 987 : 2 + 6 -7

    Pour SEL_ID 786 : -5 -4 -7

    Les valeurs MAR_ID .. SEL_ID sont inconnues.

    Merci d'avance pour les réponses car j'ai du mal à prendre les choses par le bon bout.

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    332
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2002
    Messages : 332
    Points : 502
    Points
    502
    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
     
    -- Commençons par nos données...
     
    DECLARE @TABLE TABLE (MAR_ID INT, SEL_ID INT, COL_A INT, COL_B INT)
     
    INSERT INTO @TABLE SELECT 1234, 987, 2, -4
    INSERT INTO @TABLE SELECT 1234, 786, -5, 6
    INSERT INTO @TABLE SELECT 1234, 654, 10, -7
    INSERT INTO @TABLE SELECT 3333, 0, 333, -666
    INSERT INTO @TABLE SELECT 4444, 0, 444, -666
     
    -- En assumant que SEL_ID soit unique
     
    DECLARE @SEL_ID INT
    SET @SEL_ID = 987
     
    SELECT SUM(TOTAL) AS TOTAL
    FROM
    (
    SELECT COL_A AS TOTAL
    FROM @TABLE
    WHERE SEL_ID = @SEL_ID
    UNION ALL
    SELECT SUM(COL_B) AS TOTAL
    FROM @TABLE
    WHERE SEL_ID <> @SEL_ID
    AND MAR_ID = (SELECT MAR_ID FROM @TABLE WHERE SEL_ID = @SEL_ID)
    ) TOTALS
     
    -- 987 = 1
    -- 786 = -16
    Ou avec des CTE...

    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
     
    -- Commençons par nos données...
     
    DECLARE @TABLE TABLE (MAR_ID INT, SEL_ID INT, COL_A INT, COL_B INT)
     
    INSERT INTO @TABLE SELECT 1234, 987, 2, -4
    INSERT INTO @TABLE SELECT 1234, 786, -5, 6
    INSERT INTO @TABLE SELECT 1234, 654, 10, -7
    INSERT INTO @TABLE SELECT 3333, 0, 333, -666
    INSERT INTO @TABLE SELECT 4444, 0, 444, -666
     
    -- En assumant que SEL_ID soit unique
     
    DECLARE @SEL_ID INT
    SET @SEL_ID = 786;
     
    WITH MAR_CTE (MAR_ID) AS (SELECT MAR_ID FROM @TABLE WHERE SEL_ID = @SEL_ID),
    	COL_A_CTE (TOTAL) AS (SELECT COL_A AS TOTAL FROM @TABLE WHERE SEL_ID = @SEL_ID),
    	COL_B_CTE (TOTAL) AS (SELECT SUM(COL_B) AS TOTAL FROM @TABLE WHERE SEL_ID <> @SEL_ID AND MAR_ID = (SELECT MAR_ID FROM MAR_CTE))
     
    SELECT SUM(TOTAL) AS TOTAL
    FROM (
    SELECT TOTAL
    FROM COL_A_CTE
    UNION ALL
    SELECT TOTAL
    FROM COL_B_CTE
    ) TOTALS
     
    -- 987 = 1
    -- 786 = -16

  3. #3
    Membre du Club
    Homme Profil pro
    web entrepreneur
    Inscrit en
    Novembre 2012
    Messages
    117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations professionnelles :
    Activité : web entrepreneur
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2012
    Messages : 117
    Points : 67
    Points
    67
    Par défaut
    Merci beaucoup Babyneedle

  4. #4
    Membre du Club
    Homme Profil pro
    web entrepreneur
    Inscrit en
    Novembre 2012
    Messages
    117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations professionnelles :
    Activité : web entrepreneur
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2012
    Messages : 117
    Points : 67
    Points
    67
    Par défaut
    Et sans attribuer de SEL_ID ? c'est-à-dire en passant l'ensemble pour arriver à ce résultat, comment est-il possible de procéder svp ?


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    MAR_ID   SEL_ID    TOTAL                       
    ------  --------  --------           
     1234  	987    	     1	
     1234  	786    	   -16	
     1234  	654    	    12	  
     2345   ....
     2345   ...

  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
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    Ceci doit fonctionner :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT 
        MAR_ID,
        SEL_ID,
        COL_A - COL_B + SUM(COL_B) OVER (PARTITION BY MAR_ID) AS TOTAL
    FROM @TABLE

  6. #6
    Membre du Club
    Homme Profil pro
    web entrepreneur
    Inscrit en
    Novembre 2012
    Messages
    117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations professionnelles :
    Activité : web entrepreneur
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2012
    Messages : 117
    Points : 67
    Points
    67
    Par défaut
    Bonjour aieeeuuuuu,

    Ca marche... je ne connaissais pas l' OVER(PARTITION BY...), je m'en vais me documenter pour comprendre un peu mieux le principe.

    Merci

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

Discussions similaires

  1. [XL-2010] Somme sur plage glissante avec condition
    Par Blaiz58 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 11/06/2014, 15h07
  2. Somme d'une ligne avec condition colonne
    Par mft_ghost dans le forum Excel
    Réponses: 9
    Dernier message: 04/05/2010, 22h07
  3. Faire un update sur colonnes avec condition
    Par calou_33 dans le forum SQL
    Réponses: 2
    Dernier message: 05/03/2009, 18h33
  4. [VBA-E] Minimum d'une colonne avec condition sur autre colonne
    Par Currahee dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 10/05/2007, 18h01
  5. [Oracle] Update sur 1 colonne avec condition existence (SUBSTR)
    Par magic charly dans le forum Langage SQL
    Réponses: 6
    Dernier message: 20/04/2006, 14h57

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