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 :

(Débutant) Liste des mois entre deux dates [2008R2]


Sujet :

MS SQL Server

  1. #1
    Candidat au Club
    Inscrit en
    Septembre 2009
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 3
    Points : 2
    Points
    2
    Par défaut (Débutant) Liste des mois entre deux dates
    Bonjour à tous,

    J'écris actuellement une requête qui a pour vocation de compter le nombre de consommations d'un article précis dans un magasin.
    Le but serait d'avoir les chiffres de consommation de cet article entre deux dates, y compris les mois où il n'y a pas eu de consommation où je souhaiterai que la requête indique tout simpelment 0...

    J'utilise actuellement un code du type
    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
     
     CAST(SUM(Ventes.Quantitélivrée) AS FLOAT) AS [Dn]
     
    FROM Ventes
     
    WHERE
    Ventes.DateLivraison >= @Date_debut
    AND Ventes.DateLivraison <= @Date_fin
    AND Ventes.Magasin = 'ALPHA'
    AND Ventes.Article = '123456'
     
    GROUP BY
    MONTH(Ventes.DateLivraison)

    ----

    La requête ne retourne des résultats que les mois où il y a des ventes, et j'aurai souhaité avoir "0" lorsqu'il n'y a pas de vente.
    Comment est-ce possible en SQL?
    Merci par avance pour votre aide,

  2. #2
    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,

    Idéalement, il faudrait vous appuyer sur des tables de calendrier.

    A défaut, vous pouvez créer une requête récursive pour générer la liste des mois entre le début et la fin de la plage voulue.


    Enfin, il suffira de faire une jointure externe entre la tables des mois et votre table des ventes

  3. #3
    Candidat au Club
    Inscrit en
    Septembre 2009
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par aieeeuuuuu Voir le message

    A défaut, vous pouvez créer une requête récursive pour générer la liste des mois entre le début et la fin de la plage voulue.


    Enfin, il suffira de faire une jointure externe entre la tables des mois et votre table des ventes
    Bonjour,

    Merci de votre réponse,
    Pourriez-vous me donner quelques pistes supplémentaires, car c'est précisément cette récursivité que j'ai du mal à penser en SQL : je cherche à générer cette liste sans y parvenir.

    Merci par avance pour votre aide,

  4. #4
    Invité
    Invité(e)
    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
    -- TABLE DE DATES
    CREATE TABLE dbo.Dates ( date DATETIME NOT NULL CONSTRAINT PK_Dates_date PRIMARY KEY ) 
     
    ; WITH SR as ( SELECT CAST('2009-01-01' AS DATETIME) dateDeb , CAST('2015-01-01' AS DATETIME) dateFin ),
    CTE_DATES AS ( 
    	SELECT dateDeb AS Date from SR
    	UNION ALL 
    	SELECT Date + 1 FROM CTE_DATES join SR on Date <= dateFin 
    ) 
    INSERT INTO dbo.[Dates] ([date])
    SELECT Date 
    FROM CTE_DATES 
    join SR 
    	on Date <= dateFin 
    OPTION (MAXRECURSION 32000) 
     
    select * from  dbo.Dates

  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
    Quelque chose comme ceci sur le principe, a affiner selon votre besoin précis

    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
     
    ;
    WITH DebutMois AS(--calcul du premier jour du mois de la date de debut
    	SELECT
    		DATEADD(
    			MONTH
    			,DATEDIFF(
    				MONTH
    				,0
    				,@DateDebut
    			)
    			,0
    		) AS Mois
    )
    ,
    ListeMois AS(
    	SELECT
    		Mois AS Debut
    		,DATEADD(MONTH, 1, Mois) AS Fin
    	FROM DebutMois
     
    	UNION ALL
    	SELECT	
    		DATEADD(MONTH, 1, Debut)
    		,DATEADD(MONTH, 1, Fin)
    	FROM	ListeMois
    	WHERE	Fin < @DateFin
    )	
    SELECT 
    	Debut
    	,COALESCE(SUM(Ventes.Quantitélivree),0) AS [Dn]
    FROM ListeMois M
    LEFT OUTER JOIN Ventes V
    	ON	V.DateLivraison >= M.debut
    	AND V.DateLivraison < M.Fin
    	AND Ventes.DateLivraison >= @Date_debut
    	AND Ventes.DateLivraison <= @Date_fin
    	AND Ventes.Magasin = 'ALPHA'
    	AND Ventes.Article = '123456'
    GROUP BY Debut

  6. #6
    Candidat au Club
    Inscrit en
    Septembre 2009
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Tout simplement merci pour cette dernière réponse : cela m'a aidé très effiacement!
    Merci encore,

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

Discussions similaires

  1. Liste des jours entre deux dates
    Par rvzip64 dans le forum Requêtes
    Réponses: 12
    Dernier message: 01/09/2015, 16h00
  2. fonction table pour récupérer la liste des jours entre deux dates
    Par elmoul7ak dans le forum Développement
    Réponses: 2
    Dernier message: 01/05/2010, 13h22
  3. donne le nombre des mois entre deux dates
    Par Sokol dans le forum SAS Base
    Réponses: 1
    Dernier message: 09/11/2009, 12h55
  4. Liste des mois entre deux dates
    Par ginkas31 dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 10/03/2008, 16h33
  5. Générer le listing des jours entre deux dates
    Par gsmdu62 dans le forum Langage
    Réponses: 8
    Dernier message: 01/05/2006, 11h08

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