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] Requete statistique sur intervalle n et n-1


Sujet :

MS SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de Pasiphae
    Inscrit en
    Octobre 2003
    Messages
    110
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 110
    Par défaut [SQL Server] Requete statistique sur intervalle n et n-1
    Bonjour tout le monde.

    Voila je travaille avec une base de données sql serveur.
    Je dois faire des requetes pour des statistiques (sur les ventes) et je me heurte a un probleme.

    J ai une table ligne_facture avec la qté d articles vendus par ligne, ainsi que l identifiant du produit en question sur chaque ligne. Dans ma table facture, j ai plein de choses et une date de facturation.

    Je dois remonter le nombre d articles vendus sur une periode entre 2 dates, groupés par articles, jusqu ici tout va bien. Mais je dois rajouter exactement la meme requete sur une periode identique sur l annee precedente (n-1) et la je vois pas du tout comment avoir tout ca sur la meme ligne.

    Article1 4 vendus en 2005, 8 en 2006 ...

    Si vous pourriez me donner une piste, cela m aiderait beaucoup.
    Par avance merci.

  2. #2
    Membre confirmé
    Inscrit en
    Décembre 2004
    Messages
    150
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 150
    Par défaut
    est-ce qu'on peut avoir une idée de la structure de tes tables?

  3. #3
    Membre confirmé Avatar de Pasiphae
    Inscrit en
    Octobre 2003
    Messages
    110
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 110
    Par défaut
    Oui, bien sur. Merci.
    Mais je n utilise pas tous les champs pour ma requete.

    CREATE TABLE [dbo].[Facture] (
    [FactureID] [bigint] IDENTITY (1, 1) NOT NULL ,
    [TiersID] [int] NOT NULL ,
    [DateFact] [datetime] NULL ,
    [DateLivraison] [datetime] NULL ,
    [Devise] [nvarchar] (5) COLLATE French_CI_AS NULL ,
    [NomTiers] [nvarchar] (100) COLLATE French_CI_AS NULL ,
    [AdresseTiers] [nvarchar] (100) COLLATE French_CI_AS NULL ,
    [CPTiers] [nvarchar] (30) COLLATE French_CI_AS NULL ,
    [VilleTiers] [nvarchar] (100) COLLATE French_CI_AS NULL ,
    [PaysTiers] [nvarchar] (100) COLLATE French_CI_AS NULL ,
    [NomPayeur] [nvarchar] (100) COLLATE French_CI_AS NULL ,
    [AdressePayeur] [nvarchar] (100) COLLATE French_CI_AS NULL ,
    [CPPayeur] [nvarchar] (20) COLLATE French_CI_AS NULL ,
    [VillePayeur] [nvarchar] (100) COLLATE French_CI_AS NULL ,
    [PaysPayeur] [nvarchar] (100) COLLATE French_CI_AS NULL ,
    [RemiseGlobale] [int] NULL ,
    [MontantTTC] [money] NULL ,
    [MontantTVA] [money] NULL ,
    [MontantHT] [money] NULL ,
    [NetAPayer] [money] NULL ,
    [Escompte] [money] NULL ,
    [Accompte] [money] NULL ,
    [FraisPort] [money] NULL ,
    [DateEcheance] [datetime] NULL ,
    [ConditionRegl] [nvarchar] (50) COLLATE French_CI_AS NULL ,
    [EstReglee] [tinyint] NULL ,
    [Notes] [nvarchar] (150) COLLATE French_CI_AS NULL ,
    [RefFact] [nvarchar] (20) COLLATE French_CI_AS NULL ,
    [RefCmde] [nvarchar] (20) COLLATE French_CI_AS NULL ,
    [RefLivr] [nvarchar] (20) COLLATE French_CI_AS NULL ,
    [Enlevement] [bit] NULL ,
    [Lu] [bit] NULL
    ) ON [PRIMARY]

    CREATE TABLE [dbo].[Ligne_Facture] (
    [LigneFactureID] [bigint] IDENTITY (1, 1) NOT NULL ,
    [FactureID] [bigint] NULL ,
    [ProduitID] [bigint] NULL ,
    [PrixUnitaire] [money] NULL ,
    [QteTotaleLivree] [int] NULL ,
    [LibelleProd] [nvarchar] (100) COLLATE French_CI_AS NULL ,
    [GencodeProd] [nvarchar] (15) COLLATE French_CI_AS NULL ,
    [TauxTVA] [float] NULL ,
    [TotalHT] [money] NULL ,
    [TotalTTC] [money] NULL ,
    [Remise] [int] NULL ,
    [Commentaire] [nvarchar] (300) COLLATE French_CI_AS NULL
    ) ON [PRIMARY]

    ALTER TABLE [dbo].[Facture] WITH NOCHECK ADD
    CONSTRAINT [PK_Facture] PRIMARY KEY CLUSTERED
    (
    [FactureID]
    ) ON [PRIMARY]

    ALTER TABLE [dbo].[Ligne_Facture] WITH NOCHECK ADD
    CONSTRAINT [PK_Ligne_Facture] PRIMARY KEY CLUSTERED
    (
    [LigneFactureID]
    ) ON [PRIMARY]


    Actuellement j ai essayé avec une procedure stockee :

    CREATE PROCEDURE GetStatsProd
    (
    @DateFirst datetime,
    @DateLast datetime
    )
    AS

    SELECT sum(QteTotaleLivree) as QteTotale, sum(TotalHT) as TotalHT, ProduitID
    FROM Ligne_Facture

    INNER JOIN
    Facture ON Ligne_Facture.FactureID = Facture.FactureID

    WHERE Facture.DateLivraison >= @DateFirst AND Facture.DateLivraison <= @DateLast

    Group by ProduitID




    Mon souci c est qu il me faudrait la meme chose sur la meme ligne (meme jeu de resultats) pour DateFirst - 1annee et DateLast -1annee.

    Je vois pas comment faire en une requete. C est peut etre pas possible aussi...

  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 998
    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 998
    Billets dans le blog
    6
    Par défaut
    Quelquechose comme :

    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 LF.ProduitID,
           sum(LF.QteTotaleLivree) as QteTotale, 
           sum(LF.TotalHT) as TotalHT, 
           sum(LFOLD.QteTotaleLivree) as QteTotale_LAST_YEAR, 
           sum(LFOLD.TotalHT) as TotalHT_LAST_YEAR, 
     
    FROM   Ligne_Facture LF
           INNER JOIN Facture F
                 ON LF.FactureID = F.FactureID
           LEFT OUTER JOIN Ligne_Facture LFOLD
                 ON LF.ProduitID = LFOLF.ProduitID
           LEFT OUTER JOIN Facture FOLD
                 ON LFOLD.FactureID = FOLD.FactureID
     
    WHERE  F.DateLivraison BETWEEN @DateFirst AND @DateLast 
      AND  FOLD.DateLivraison BETWEEN DATEADD(year, -1, @DateFirst) AND DATEADD(year, -1, @DateLast)
     
    Group  by ProduitID

    Pas testé !

    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/ * * * * *

  5. #5
    Membre confirmé Avatar de Pasiphae
    Inscrit en
    Octobre 2003
    Messages
    110
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 110
    Par défaut
    Merci beaucoup pour votre aide.

    Votre requete fonctionne beaucoup mieux que la meme c est certain. Par contre, lorsque je n ai pas de ventes l annee precedente ou si j en ai l annee precedente et pas l annee en cours, ca ne me renvoie rien.

    Ca devrait me renvoyer qqch du genre
    PRODUIT , Qte 2006, HT2006 , Qte 2005 (n-1), HT 2005 (n-1)
    1, 3, 12, 0, 0
    2, 5, 15, 2, 15

    Votre requete ne me retourne que la derniere ligne.
    Si vous pouvriez m aider encore un petit peu, s il vous plait... Je ne voudrais cependant pas abuser...

    [edité pour correction des donnees attendues]

  6. #6
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Par défaut
    Essaye :

    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 LF.ProduitID,
           sum(LF.QteTotaleLivree) as QteTotale, 
           sum(LF.TotalHT) as TotalHT, 
           sum(LFOLD.QteTotaleLivree) as QteTotale_LAST_YEAR, 
           sum(LFOLD.TotalHT) as TotalHT_LAST_YEAR, 
     
    FROM   Ligne_Facture LF
           INNER JOIN Facture F
                 ON LF.FactureID = F.FactureID
           LEFT OUTER JOIN Ligne_Facture LFOLD
                 ON LF.ProduitID = LFOLF.ProduitID
           LEFT OUTER JOIN Facture FOLD
                 ON LFOLD.FactureID = FOLD.FactureID
                 AND FOLD.DateLivraison BETWEEN DATEADD(year, -1, @DateFirst) AND DATEADD(year, -1, @DateLast)
    WHERE  F.DateLivraison BETWEEN @DateFirst AND @DateLast 
      AND  
     
    Group  by ProduitID

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

Discussions similaires

  1. [SQL SERVER 2005] Detail sur une requete avec un min(date)
    Par Djaiffe dans le forum Développement
    Réponses: 4
    Dernier message: 21/09/2012, 11h04
  2. [SQL-SERVER] Requete de création de connexion
    Par Sytchev3 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 03/04/2006, 16h12
  3. sql-server 2000 généralités sur sql-server ( débutant)
    Par ducho dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 28/02/2006, 18h10
  4. [SQL Server] Requete update sur 2 champs
    Par galou10 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 21/02/2006, 20h22
  5. SQL server standart edition sur un serveur bi processeur
    Par alpachico dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 04/08/2005, 09h46

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