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 :

Différence quantité entre min(date) et max(date) [2008R2]


Sujet :

Développement SQL Server

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Gestionnaire Base de données Commerciales
    Inscrit en
    Août 2015
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : Gestionnaire Base de données Commerciales

    Informations forums :
    Inscription : Août 2015
    Messages : 7
    Points : 6
    Points
    6
    Par défaut Différence quantité entre min(date) et max(date)
    Bonjour,

    Je développe une requête afin de calculer les différences de quantités, pour une ligne de commande, entre le moment où elle est créée et le moment où la quantité est modifiée pour la dernière fois.
    Je penser passer par une table temporaire mais cela ne semble pas fonctionner car toutes les modifications sont remontées, or je ne veux que la différence entre la première et la dernière.

    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
     
    CREATE TABLE #modif(
    commande nvarchar(20),
    datemodif datetime,
    diffqty float)
     
     
    INSERT INTO #modif(
    commande,
    datemodif,
    diffqty)
     
    SELECT 
    h.commandeid as [commande],
    h.modificationDate as [datemodif],
    h.qtyavant-h.qtyaprès as [diffqty]
     
    FROM TABLECOMMANDE h
     
    UPDATE #modif
    SET datemodif=(SELECT min(h.modificationDate) FROM TABLECOMMANDE h
    WHERE h.commandeid=#modif.commande)
     
    UPDATE #modif
    SET datemodif=(SELECT max(h.modificationDate) FROM TABLECOMMANDE h
    WHERE h.commandeid=#modif.commande)
     
     
    SELECT 
    commande,
    diffqty,
    datemodif
    FROM #modif
     
    DROP TABLE #modif

  2. #2
    Membre expérimenté

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2003
    Messages : 733
    Points : 1 668
    Points
    1 668
    Billets dans le blog
    8
    Par défaut
    Bonjour,

    A partir de SQL Server 2012 tu peux procéder comme suit :

    Code SQL : 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
    WITH CTE_Commande (commande
                       , date_premiere_modif
    		   , date_derniere_modif, 
                       , qty_avant_Premiere
    		   , qty_apres_Derniere) 
    AS
    SELECT  h.commandeid AS Commande 
           , min (h.modificationDate) OVER(PARTITION BY h.commandeid ) AS date_premiere_modif
           , max (h.modificationDate) OVER(PARTITION BY h.commandeid ) AS date_derniere_modif
           , first_value (qty_avant) OVER (PARTITION BY h.commandeid  ORDER BY h.modificationDate asc ) AS qty_avant_Premiere 
           , first_value (qty_apres) OVER (PARTITION BY h.commandeid  ORDER BY h.modificationDate desc) AS qty_apres_Derniere 
    FROM dbo.TABLECOMMANDE h 
    SELECT CTE_Commande.Commande AS Commande 
           , min(CTE_Commande.date_premiere_modif)  AS date_premiere_modif 
           , max(CTE_Commande.date_premiere_modif)  AS date_derniere_modif 
          , min(CTE_Commande.qty_avant_premiere) - max(CTE_Commande.qty_apres_derniere)  as diffqty 
    FROM  CTE_Commande 	   
    GROUP BY CTE_Commande.Commande 
    ORDER BY CTE_Commande.Commande

    Remarque :

    La distinction entre min, max et first_value ainsi que l'order by (asc ou desc) dans partitionnement a toute son importance dans la définition de la CTE_Commande
    En revanche dans le 2 ème SELECT (utilisation de la CTE_Commande), tu peux utiliser indifféremment, min ou max, cela n'a aucune importance !
    En effet, le partitionnement a déjà été effectué sur le n° de la commande, et pour une commande donnée, ces valeurs agrégées par les fonctions de fenêtrage sont identiques mêmes si par ailleurs elles sont dupliquées, et c'est normal, autant de fois qu'il y a de lignes historiques de la dite commande.
    Ces lignes historiques dupliquées sont ensuite agrégées par le GROUP BY : GROUP BY CTE_Commande.Commande pour ne garder qu'une seule ligne par commande.

    A+
    "Une idée mal écrite est une idée fausse !"
    http://hamid-mira.blogspot.com

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Gestionnaire Base de données Commerciales
    Inscrit en
    Août 2015
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : Gestionnaire Base de données Commerciales

    Informations forums :
    Inscription : Août 2015
    Messages : 7
    Points : 6
    Points
    6
    Par défaut
    Bonjour,

    Merci beaucoup pour ces infos qui me seront certainement très utiles dans le cas d'un upgrade de notre SQL serveur, cependant sous SQL 2008 la fonction n'est pas reconnu!
    Une idée pour contourné cela ?

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

    Vous pouvez utiliser ROW_NUMBER.

    comme ceci (pas testé)

    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
     
    WITH CTE AS(
    	SELECT 
    			commandeid 
    		,	modificationDate
    		,	qty_apres as qte
    		,	ROW_NUMBER() OVER(PARTITION BY commandeid ORDER BY modificationDate) AS RNAsc
    		,	ROW_NUMBER() OVER(PARTITION BY commandeid ORDER BY modificationDate DESC ) AS RNDesc
    	FROM 	dbo.TABLECOMMANDE	
    )
    SELECT
    		A.commandeid		AS commande
    	,	A.modificationDate	AS DatePremiereModif
    	,	B.modificationDate	AS DateDerniereModif
    	,	A.qte - B.qte		AS DiffQte
    FROM CTE A
    INNER JOIN CTE B
    	ON B.commandeid = A.commandeid
    WHERE	A.RNAsc = 1
    	AND	B.RNDesc = 1

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Gestionnaire Base de données Commerciales
    Inscrit en
    Août 2015
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : Gestionnaire Base de données Commerciales

    Informations forums :
    Inscription : Août 2015
    Messages : 7
    Points : 6
    Points
    6
    Par défaut
    Impeccable,

    Merci Beaucoup

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 24/08/2012, 11h54
  2. [XL-2007] couleur cellule date differente si date passee, ou date du jour
    Par chris09300 dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 29/03/2011, 08h24
  3. [AC-2003] Max date from multiple date fields?
    Par Mounamidou dans le forum IHM
    Réponses: 10
    Dernier message: 21/12/2010, 18h28
  4. différence entre date sytème et date du bios
    Par zoheir13 dans le forum Delphi
    Réponses: 1
    Dernier message: 05/05/2007, 19h28
  5. différence durée entre date jour/date champ
    Par debdev dans le forum Access
    Réponses: 9
    Dernier message: 30/11/2005, 16h55

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