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 :

[SQL Server 2000] SELECT avec CASE et GROUP BY


Sujet :

MS SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Avatar de strat0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2003
    Messages
    288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2003
    Messages : 288
    Par défaut [SQL Server 2000] SELECT avec CASE et GROUP BY
    Bonjour,

    J'ai besoin d'effectuer un CASE sur un champ DateTime afin d'afficher le nom du mois, et parallèlement j'ai besoin de regrouper avec un GROUP BY les résultats sur ce même champ DateTime, par mois de l'année. Voilà ma seule requête qui fonctionne :
    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
    SELECT COUNT(*), 'Periode' = 
    CASE DATEPART(m, [StatDate])
        WHEN 1 THEN 'Janvier '
        WHEN 2 THEN 'Février '
        WHEN 3 THEN 'Mars '
        WHEN 4 THEN 'Avril '
        WHEN 5 THEN 'Mai '
        WHEN 6 THEN 'Juin '
        WHEN 7 THEN 'Juillet '
        WHEN 8 THEN 'Août '
        WHEN 9 THEN 'Septembre '
        WHEN 10 THEN 'Octobre '
        WHEN 11 THEN 'Novembre '
        WHEN 12 THEN 'Décembre '
    END
    + CAST(DATEPART(yyyy, [StatDate]) AS VARCHAR)
    FROM [MATABLE]
    GROUP BY [StatDate];
    Sauf que... Les résultats sont regroupés par jour, pas par mois de l'année, c'est-à-dire sur l'ensemble du champ DateTime et non pas seulement sur le mois et l'année.

    Vous allez me dire pas étonnant avec ce que tu as mis dans ta clause GROUP BY, et je vous répondrai que rien d'autre de ce que j'ai pu essayer (effectuer un DATEPART, recopier l'ensemble du CASE déjà présent dans le SELECT, ...) n'a bien voulu fonctionné.

    Donc je suis ouvert à toutes suggestions.

    N.B : GROUP BY 2 n'existe pas sur SQL Server.

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 990
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 990
    Billets dans le blog
    6
    Par défaut
    Il serait plus intelligent de faire ceci avec une jointure avec une table des mois, voire une table calendrier comme indiqué dans l'article que j'ai écrit ici :
    http://sqlpro.developpez.com/cours/gestiontemps/

    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
    SELECT COUNT(*), 
    CASE DATEPART(m, StatDate)
        WHEN 1 THEN 'Janvier '
        WHEN 2 THEN 'Février '
        WHEN 3 THEN 'Mars '
        WHEN 4 THEN 'Avril '
        WHEN 5 THEN 'Mai '
        WHEN 6 THEN 'Juin '
        WHEN 7 THEN 'Juillet '
        WHEN 8 THEN 'Août '
        WHEN 9 THEN 'Septembre '
        WHEN 10 THEN 'Octobre '
        WHEN 11 THEN 'Novembre '
        WHEN 12 THEN 'Décembre '
    END AS Periode 
    + CAST(DATEPART(yyyy, [StatDate]) AS VARCHAR)
    FROM [MATABLE]
    GROUP BY CASE DATEPART(m, [StatDate])
        WHEN 1 THEN 'Janvier '
        WHEN 2 THEN 'Février '
        WHEN 3 THEN 'Mars '
        WHEN 4 THEN 'Avril '
        WHEN 5 THEN 'Mai '
        WHEN 6 THEN 'Juin '
        WHEN 7 THEN 'Juillet '
        WHEN 8 THEN 'Août '
        WHEN 9 THEN 'Septembre '
        WHEN 10 THEN 'Octobre '
        WHEN 11 THEN 'Novembre '
        WHEN 12 THEN 'Décembre '
    END;
    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    Membre éclairé
    Avatar de strat0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2003
    Messages
    288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2003
    Messages : 288
    Par défaut
    Bonjour,

    Le code que tu me proposes ne fonctionne malheureusement pas.

    Par contre je me demande : est-ce qu'il y a une table système contenant les noms des mois dans Sql Server? Je sais qu'il y a la fonction DATENAME(). D'ailleurs j'ai essayé ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT COUNT(*), (DATENAME(month, [StatDate]) + ' ' + CAST(DATEPART(yyyy, [StatDate]) AS VARCHAR)) AS Periode
    FROM [MATABLE] 
    GROUP BY Periode;
    Ça me lève carrément une erreur inconnue dans mon appli C#; il semble que le AS ne passe pas. D'ailleurs sans le AS et avec un GROUP BY [StatDate] ça passe mais j'ai toujours le même problème : regroupement par jour et pas par mois de l'année.

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 990
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 990
    Billets dans le blog
    6
    Par défaut
    Il manque un petit bout dans le group by.

    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
    SELECT COUNT(*), 
    CASE DATEPART(m, StatDate)
        WHEN 1 THEN 'Janvier '
        WHEN 2 THEN 'Février '
        WHEN 3 THEN 'Mars '
        WHEN 4 THEN 'Avril '
        WHEN 5 THEN 'Mai '
        WHEN 6 THEN 'Juin '
        WHEN 7 THEN 'Juillet '
        WHEN 8 THEN 'Août '
        WHEN 9 THEN 'Septembre '
        WHEN 10 THEN 'Octobre '
        WHEN 11 THEN 'Novembre '
        WHEN 12 THEN 'Décembre '
    END AS Periode 
    + CAST(DATEPART(yyyy, StatDate) AS CHAR(8))
    FROM [MATABLE]
    GROUP BY CASE DATEPART(m, StatDate)
        WHEN 1 THEN 'Janvier '
        WHEN 2 THEN 'Février '
        WHEN 3 THEN 'Mars '
        WHEN 4 THEN 'Avril '
        WHEN 5 THEN 'Mai '
        WHEN 6 THEN 'Juin '
        WHEN 7 THEN 'Juillet '
        WHEN 8 THEN 'Août '
        WHEN 9 THEN 'Septembre '
        WHEN 10 THEN 'Octobre '
        WHEN 11 THEN 'Novembre '
        WHEN 12 THEN 'Décembre '
    END + CAST(DATEPART(yyyy, StatDate) AS CHAR(8));
    Mais comme je vous l'ais dit cette requête est particulièrement "dégueulasse"...

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

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

Discussions similaires

  1. [SQL Server 2000]Update avec case
    Par nox75 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 07/10/2007, 20h18
  2. [SQL Server 2000] Select from @variable
    Par chorokari dans le forum Langage SQL
    Réponses: 2
    Dernier message: 26/12/2006, 12h58
  3. [SQL Server 2000] requête avec le nom de la table dynamique
    Par insane_80 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 07/12/2006, 17h57
  4. [SQL Server 2000]Probleme avec les dates !
    Par ChristopheOce dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 26/10/2006, 15h58
  5. sql server 2000 installation avec amd 64
    Par rouchederoche dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 06/10/2006, 09h39

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