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

Langage SQL Discussion :

Groupement par date avec jointure


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 14
    Points : 20
    Points
    20
    Par défaut Groupement par date avec jointure
    Bonjour à tous,

    j'ai besoin des compétences d'un DBA sympa :-P

    Je vous explique mon cas :

    Je travaille sur l'outil Microsoft Dynamics CRM 2011 et je fais actuellement du reporting.

    J'ai 3 entitées (Entité A - Entité B - Entité C) donc 3 tables.

    Chacunes sont reliés entre elles dans dynamics. Je m'explique :

    L'entité A contient des informations de type (Nom, date de création, Date de modification, Id)
    L'entité B contient des informations de type (Id, date de création / modification/ liens avec l'entité A)
    L'entité C contient le même type de données et contient le liens avec l'entité B

    L'entité A est un dossier voiture par exemple
    L'entité B est un dossier déplacement
    L'entité C est un dossier plein d'essence

    Dans la pratique, l'ensemble des 3 entités nous permet de savoir que la voiture A a réalisé tel déplacement, et a réalisé X plein d'essence pour faire ses déplacements.

    Bon le décor est planté, j'espère avoir été clair, c'est purement fictif mais la réalité est bien plus compliquée à expliquer :-P

    Passons maintenant à mon souhait dans ma requete.

    je souhaite récupérer en une requete le déplacement le plus récent de chaque voiture ainsi que des infos diverses de la table voiture / déplacement / plein d'essence.

    Je ne dois donc trouver qu'une seule ligne par voiture mais qui contient certaines infos des autres tables.

    Pour les infos pas de soucis, INNER JOIN et compagnie et j'ai tout. Sauf qu'actuellement, je me retrouve avec quelque chose de ce type :

    VOITURE A / Déplacement 1 / montant du plein : 80 € / 1200 Km parcourus / Le 03/07/2009
    VOITURE A / Déplacement 2 / montant du plein : 86 € / 1150 Km parcourus / Le 03/07/2010
    VOITURE A / Déplacement 3 / montant du plein : 43 € / 840 Km parcourus / Le 03/07/2011
    VOITURE A / Déplacement 4 / montant du plein : 98 € / 1308 Km parcourus / Le 03/07/2012
    VOITURE B / Déplacement 1 / montant du plein : 80 € / 1200 Km parcourus / Le 03/07/2009
    VOITURE B / Déplacement 2 / montant du plein : 86 € / 1150 Km parcourus / Le 03/07/2010
    VOITURE B / Déplacement 3 / montant du plein : 43 € / 840 Km parcourus / Le 03/07/2011
    VOITURE B / Déplacement 4 / montant du plein : 98 € / 1308 Km parcourus / Le 03/07/2012

    Je ne voudrais avoir que les plus récents déplacements de chaque voiture :

    VOITURE A / Déplacement 4 / montant du plein : 98 € / 1308 Km parcourus / Le 03/07/2012
    VOITURE B / Déplacement 4 / montant du plein : 98 € / 1308 Km parcourus / Le 03/07/2012


    Clairement, je ne sais pas comment m'y prendre, comment effectuer ma recherche sur le net, etc...

    J'ai essayé des group By Voiture ça ne fonctionne pas. J'ai un message d'erreur qui m'indique que mes autres champs ne sont pas des fonctions d'agrégations. Pareil en mettant MAX(maDateDeDéplacement) dans mon SELECT.

    Si ça peut vous aider, je travaille en environnement purement microsoft donc T-SQL.

    J'espère avoir donné toutes les infos nécessaires. En tout cas, merci pour les pistes que vous pourrez m'apporter !

    N'hésitez pas à me demander plus de détails !

    Cordialement

    -------


    Si ça peut vous aider, voici ma requete :

    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
    SELECT
    	[ODM].[CreatedOn] as 'Date de création du mandat',
    	[ODM].[new_serviceordernumber] as 'Numéro du mandat',
    	[Mouvement].[modifiedon] as 'Date du mouvement',
     
    	[ODM].[new_serviceorderId] as 'ID_Odm',
    	[Incident].[incidentid] as 'ID_Incident',
     
    	[Mouvement].[new_movementtypename],
    	[Mouvement].[new_name],
    	[Incident].[incidentid],
    	[Incident].[new_serviceorderid],
    	[ODM].[statecode],
    	[ODM].[statuscode]
     
      FROM
    	(
    		SELECT
    		MAX([modifiedon]) as 'Date du mouvement',
    		[new_incidentid]
    		FROM
    		[Filterednew_movement]
    		GROUP BY [new_incidentid]
    	) as Mouvement_recents
     
    INNER JOIN
    [Filterednew_movement] as Mouvement on [Mouvement].[new_incidentid] = [Mouvement_recents].[new_incidentid]
    INNER JOIN
    [FilteredIncident] as Incident on [Incident].[incidentid] = [Mouvement_recents].[new_incidentid]
    INNER JOIN
    [new_serviceorder] as ODM on [Incident].[new_serviceorderid] = [ODM].[new_serviceorderId]
     
    WHERE
    	[ODM].[statuscode] != 2 AND
    	[ODM].[statuscode] != 100000002
     
    ORDER BY [ODM].[CreatedOn] ASC

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    bonjour,

    c aurait été plus simple avec la version de Sql Serveur que vous utilisez.

    On règle ce genre de c as soit par une fonction de fenetrage : http://sqlpro.developpez.com/article...clause-window/

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    with tmp as (
    select col_partition, valeur, date_classement,
    row_number() over(partition by col_partition order by date_classement desc) as rnk
    from ma_table
    where conditions... )
    select *
    from tmp
    where rnk = 1


    Soit avec une sous requete : http://mysql.developpez.com/telechar...aque-categorie

  3. #3
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 14
    Points : 20
    Points
    20
    Par défaut
    Pardon, il s'agit de SQL Server 2008 R2.

    Je vais creuser ces pistes, je ne connaissais absolument pas le fenêtrage

    Je vais voir, déjà merci en tout cas :-P Je reviens vers vous si ça ne va pas

Discussions similaires

  1. [XSLT] tri par date avec xsl:sort
    Par Tanebisse dans le forum XSL/XSLT/XPATH
    Réponses: 5
    Dernier message: 15/04/2010, 16h06
  2. Groupement par DATE echantillonnage
    Par aymeric_garnier dans le forum Langage SQL
    Réponses: 8
    Dernier message: 21/04/2008, 13h01
  3. pb groupement par date
    Par maysa dans le forum Langage SQL
    Réponses: 2
    Dernier message: 25/05/2007, 09h43
  4. [MySQL] Tri par date avec timestamp
    Par shutdown76 dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 05/01/2007, 02h37
  5. Groupement par dates
    Par Nico_57 dans le forum Requêtes
    Réponses: 4
    Dernier message: 19/06/2006, 14h43

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