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 :

Syntaxe CASE pour SUM


Sujet :

Développement SQL Server

  1. #1
    Membre actif Avatar de arthuro45
    Profil pro
    Développeur du dimanche
    Inscrit en
    Juillet 2009
    Messages
    602
    Détails du profil
    Informations personnelles :
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur du dimanche

    Informations forums :
    Inscription : Juillet 2009
    Messages : 602
    Points : 265
    Points
    265
    Par défaut Syntaxe CASE pour SUM
    Bonjour,

    Je cherche à sommer la colonne C.ACTDUREVENTIL avec une condition :
    si C.ACTUNITE = 'J' alors C.ACTUNITE vaut '700'

    La requête ci-dessous ne génère pas d'erreur mais seulement 2 lignes (normal).
    Je débute en Transact, pourriez-vous me donner la bonne syntaxe ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT 
    CASE C.ACTUNITE WHEN 'J' THEN '700' END
    ,SUM(C.actdureventil) AS 'total' 
    FROM PERSVAR A JOIN PERS B ON A.matric = B.matric 
    INNER JOIN ACTIVENTIL C ON A.matric = C.matric 
    WHERE 
    A.dsitud = (SELECT MAX(dsitud) FROM PERSVAR B WHERE B.matric = A.matric) 
    AND C.actdatventil BETWEEN '2010-01-01' AND '2010-12-31' 
    AND A.matric = '214554'
    GROUP BY C.ACTUNITE

  2. #2
    Expert éminent sénior
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Points : 12 891
    Points
    12 891
    Par défaut
    Bonjour,

    Est ce que le total de la somme doit être égale à 700 ou bien pour chaque cas rencontré C.ACTUNITE = 'J' --> C.ACTDUREVENTIL = 700 ?

    ++

  3. #3
    Membre actif Avatar de arthuro45
    Profil pro
    Développeur du dimanche
    Inscrit en
    Juillet 2009
    Messages
    602
    Détails du profil
    Informations personnelles :
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur du dimanche

    Informations forums :
    Inscription : Juillet 2009
    Messages : 602
    Points : 265
    Points
    265
    Par défaut
    C'est comme ceci effectivement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    chaque cas rencontré C.ACTUNITE = 'J' --> C.ACTDUREVENTIL = 700

  4. #4
    Expert éminent sénior
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Points : 12 891
    Points
    12 891
    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
    SELECT 
     SUM(CASE C.ACTUNITE WHEN 'J' THEN 700
                         ELSE C.actdureventil
         END) AS 'total'              
    FROM PERSVAR A 
    JOIN PERS B 
     ON A.matric = B.matric 
    INNER JOIN ACTIVENTIL C 
     ON A.matric = C.matric 
    WHERE A.dsitud = (SELECT MAX(dsitud) 
                      FROM PERSVAR B WHERE B.matric = A.matric) 
     AND C.actdatventil BETWEEN '2010-01-01' AND '2010-12-31' 
      AND A.matric = '214554'
    GROUP BY C.ACTUNITE
    ++

  5. #5
    Membre actif Avatar de arthuro45
    Profil pro
    Développeur du dimanche
    Inscrit en
    Juillet 2009
    Messages
    602
    Détails du profil
    Informations personnelles :
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur du dimanche

    Informations forums :
    Inscription : Juillet 2009
    Messages : 602
    Points : 265
    Points
    265
    Par défaut
    Excusez moi, je me suis mal exprimé, je voudrais ajouter C.ACTUNITE à C.actdureventil quand C.ACTUNITE = 'J' THEN 700

    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 
     SUM(CASE C.ACTUNITE WHEN 'J' THEN 700
                         + C.actdureventil
         END) AS 'total' 
     END               
    FROM PERSVAR A 
    JOIN PERS B 
     ON A.matric = B.matric 
    INNER JOIN ACTIVENTIL C 
     ON A.matric = C.matric 
    WHERE A.dsitud = (SELECT MAX(dsitud) 
                      FROM PERSVAR B WHERE B.matric = A.matric) 
     AND C.actdatventil BETWEEN '2010-01-01' AND '2010-12-31' 
      AND A.matric = '214554'
    GROUP BY C.ACTUNITE

  6. #6
    Expert éminent sénior
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Points : 12 891
    Points
    12 891
    Par défaut
    Ok :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SELECT 
     SUM(CASE C.ACTUNITE WHEN 'J' THEN 700 + C.actdureventil
                         ELSE C.actdureventil
         END) AS 'total'              
    FROM PERSVAR A 
    JOIN PERS B 
     ON A.matric = B.matric 
    INNER JOIN ACTIVENTIL C 
     ON A.matric = C.matric 
    WHERE A.dsitud = (SELECT MAX(dsitud) 
                      FROM PERSVAR B WHERE B.matric = A.matric) 
     AND C.actdatventil BETWEEN '2010-01-01' AND '2010-12-31' 
      AND A.matric = '214554'
    GROUP BY C.ACTUNITE
    ++

  7. #7
    Membre actif Avatar de arthuro45
    Profil pro
    Développeur du dimanche
    Inscrit en
    Juillet 2009
    Messages
    602
    Détails du profil
    Informations personnelles :
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur du dimanche

    Informations forums :
    Inscription : Juillet 2009
    Messages : 602
    Points : 265
    Points
    265
    Par défaut
    Celle-ci me donne 2 lignes sans sommer C.ACTUNITE et C.actdureventil, C.actdureventil est sommée mais pas C.ACTUNITE


    Ok :

    Code :

    SELECT
    SUM(CASE C.ACTUNITE WHEN 'J' THEN 700 + C.actdureventil
    ELSE C.actdureventil
    END) AS 'total'
    FROM PERSVAR A
    JOIN PERS B
    ON A.matric = B.matric
    INNER JOIN ACTIVENTIL C
    ON A.matric = C.matric
    WHERE A.dsitud = (SELECT MAX(dsitud)
    FROM PERSVAR B WHERE B.matric = A.matric)
    AND C.actdatventil BETWEEN '2010-01-01' AND '2010-12-31'
    AND A.matric = '214554'
    GROUP BY C.ACTUNITE
    Par contre celle-ci (la 1er) me fait aussi 2 lignes en sommant chacune d'elle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SELECT 
     SUM(CASE C.ACTUNITE WHEN 'J' THEN 700
                         ELSE C.actdureventil
         END) AS 'total'                
    FROM PERSVAR A 
    JOIN PERS B 
     ON A.matric = B.matric 
    INNER JOIN ACTIVENTIL C 
     ON A.matric = C.matric 
    WHERE A.dsitud = (SELECT MAX(dsitud) 
                      FROM PERSVAR B WHERE B.matric = A.matric) 
     AND C.actdatventil BETWEEN '2010-01-01' AND '2010-12-31' 
      AND A.matric = '214554'
    GROUP BY C.ACTUNITE

  8. #8
    Expert éminent sénior
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Points : 12 891
    Points
    12 891
    Par défaut
    Pourriez vous donner un petit exemple d'un jeu de données et le résultat attendu pour bien comprendre le problème ?

    Merci

    ++

  9. #9
    Membre actif Avatar de arthuro45
    Profil pro
    Développeur du dimanche
    Inscrit en
    Juillet 2009
    Messages
    602
    Détails du profil
    Informations personnelles :
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur du dimanche

    Informations forums :
    Inscription : Juillet 2009
    Messages : 602
    Points : 265
    Points
    265
    Par défaut
    Merci de prendre le temps de te pencher sur mon problème

    Voici les structures des 3 tables + un jeu de données :

    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
    CREATE TABLE [dbo].[ACTIVENTIL](
        [ROWID] [int] IDENTITY(1,1) NOT NULL,
        [ACTDATVENTIL] [datetime] NOT NULL,
        [MATRIC] [int] NOT NULL,
        [ACTDUREVENTIL] [smallint] NULL,
        [ACTUNITE] [varchar](1) COLLATE French_CI_AS NULL,
     CONSTRAINT [PK__ACTIVENTIL__060DEAE8] PRIMARY KEY CLUSTERED 
    (
        [ROWID] ASC
    )WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
    ) ON [PRIMARY]
     
    CREATE TABLE [dbo].[PERS](
        [ROWID] [int] IDENTITY(1,1) NOT NULL,
        [MATRIC] [int] NOT NULL,
     CONSTRAINT [PK__PERS__28B808A7] PRIMARY KEY CLUSTERED 
    (
        [ROWID] ASC
    )WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
    ) ON [PRIMARY]
     
    CREATE TABLE [dbo].[PERSVAR](
        [ROWID] [int] NOT NULL,
        [MATRIC] [int] NULL,
        [DSITUD] [datetime] NULL,
    ) ON [PRIMARY]
    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
    INSERT INTO [dbo].[ACTIVENTIL]
               ([ACTDATVENTIL]
               ,[MATRIC]
               ,[ACTDUREVENTIL]
               ,[ACTUNITE])
         VALUES
               (03/01/2010 00:00:00
               ,214554
               ,100
               ,'H')
     
    INSERT INTO [dbo].[ACTIVENTIL]
               ([ACTDATVENTIL]
               ,[MATRIC]
               ,[ACTDUREVENTIL]
               ,[ACTUNITE])
         VALUES
               (04/01/2010 00:00:00
               ,214554
               ,200
               ,'H')
     
    INSERT INTO [dbo].[ACTIVENTIL]
               ([ACTDATVENTIL]
               ,[MATRIC]
               ,[ACTDUREVENTIL]
               ,[ACTUNITE])
         VALUES
               (05/01/2010 00:00:00
               ,214554
               ,NULL
               ,'J')
     
    INSERT INTO [dbo].[PERS]
               ([MATRIC])
         VALUES
               (214554)
     
    INSERT INTO [dbo].[PERSVAR]
               ([MATRIC]
               ,[DSITUD])
         VALUES
               (214554
               ,02/01/2010 00:00:00)
    Résultat attendu :

    Si on remplace ACTDUREVENTIL par 700 quand ACTUNITE = 'J', le résultat devra être : 1000 <-- ((100+200) + 700)

  10. #10
    Membre actif Avatar de arthuro45
    Profil pro
    Développeur du dimanche
    Inscrit en
    Juillet 2009
    Messages
    602
    Détails du profil
    Informations personnelles :
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur du dimanche

    Informations forums :
    Inscription : Juillet 2009
    Messages : 602
    Points : 265
    Points
    265
    Par défaut
    J'ai tenté comme ça, mais le résultat n'est pas bon, j'ai 2 lignes --> 300 et NULL

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT 
     SUM(CASE C.ACTUNITE WHEN 'J' THEN (700+C.actdureventil)
                         ELSE C.actdureventil
         END) AS 'total'                
    FROM PERS B  
    INNER JOIN ACTIVENTIL C 
     ON B.matric = C.matric 
    WHERE C.actdatventil BETWEEN '01/01/2010' AND '31/12/2010' 
      AND B.matric = '214554'
    GROUP BY C.ACTUNITE
    De plus le problème se corse un peu : maintenant j'ai 3 conditions au lieu d'une avec le "J".
    Si "J" --> C.actdureventil = 700
    Si "S" --> C.actdureventil = 300
    Si "M" --> C.actdureventil = 350
    sinon C.actdureventil.

    Ne serait-il pas préférable d'écrire un procédure stockée, ou bien continuer avec ma requête ?

  11. #11
    Membre actif Avatar de arthuro45
    Profil pro
    Développeur du dimanche
    Inscrit en
    Juillet 2009
    Messages
    602
    Détails du profil
    Informations personnelles :
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur du dimanche

    Informations forums :
    Inscription : Juillet 2009
    Messages : 602
    Points : 265
    Points
    265
    Par défaut
    Ca fonctionne, la requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT 
     SUM(CASE C.ACTUNITE WHEN 'J' THEN 700
                         WHEN 'S' THEN 100
                         WHEN 'M' THEN 200
                        ELSE C.actdureventil
         END) AS 'total'                
    FROM PERS B  
    INNER JOIN ACTIVENTIL C 
     ON B.matric = C.matric 
    WHERE C.actdatventil BETWEEN '01/01/2010' AND '31/12/2010' 
      AND B.matric = '214554'
    J'ai retiré le GROUP BY.

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

Discussions similaires

  1. Aide pour SUM et CASE
    Par lagsurfer dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 05/03/2013, 17h05
  2. Réponses: 3
    Dernier message: 31/03/2006, 08h47
  3. quelle syntaxe svp pour ce code ?
    Par man123 dans le forum Langage
    Réponses: 10
    Dernier message: 16/11/2005, 00h05
  4. switch case pour deux variable en meme temps
    Par petitours dans le forum C
    Réponses: 3
    Dernier message: 06/11/2005, 19h20
  5. Syntaxe PARAMETERS pour requête sous VBA
    Par GAGNON dans le forum VBA Access
    Réponses: 3
    Dernier message: 28/11/2003, 11h39

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