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 :

Autojointure dans une requête ?


Sujet :

Langage SQL

  1. #1
    Membre habitué Avatar de Avatar
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Juillet 2005
    Messages
    136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 136
    Points : 150
    Points
    150
    Par défaut Autojointure dans une requête ?
    Bonjour,

    Je souhaite écrire une requête permettant de trouver par mois, par année et par région le nombre de clients actifs, c'est à dire le nombre de clients ayant commandés les deux derniers mois.
    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
     
    Exemple de source de donnée donnant les commandes d un client chaque mois.
    anneefact	moisfact	region	        clientcde
    2012	        2	        1	        CLI1
    2012	        4	        1	        CLI1
    2012	        7	        1	        CLI1
    2012	        8	        1	        CLI1
    2012	        5	        2	        CLI2
    2012	        6	        2	        CLI2
     
    L idée est d obtenir le résultat suivant :
    année	mois	nombre clients actifs
    2012        	4	1
    2012      	6	1
    2012      	8	1
    Pour cela j'ai utilisé un curseur. Par contre je suis quasiment sur qu'il doit être possible d'arriver au même résultat bien plus élégamment avec une autojointure, mais je beau me tordre l'esprit, je n'arrive pas à l'écrire.

    Merci par avance pour votre aide.

    Création jeu de test + curseur :
    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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
     
    --DROP TABLE testg
    -- création jeu de test
     
    CREATE TABLE testg
    	(
    		annee int,
    		mois int,
    		region int,
            clientcde varchar(50)
    	)
     
    INSERT INTO testg VALUES (2012, 2, 1, 'CLI1')
    INSERT INTO testg VALUES (2012, 4, 1, 'CLI1')
    INSERT INTO testg VALUES (2012, 7, 1, 'CLI1')
    INSERT INTO testg VALUES (2012, 8, 1, 'CLI1')
    INSERT INTO testg VALUES (2012, 5, 2, 'CLI2')
    INSERT INTO testg VALUES (2012, 6, 2, 'CLI2')
     
    --création table pour stocker résultats intermédiaires
    DECLARE @result TABLE 
    (
    	annee int,
    	mois int,
    	region int,
        clientcde varchar(50)
    )
     
    DECLARE @annee int
    DECLARE @mois int
    DECLARE @region int
    DECLARE @clientcde varchar(50)
     
    DECLARE Q1 SCROLL CURSOR FOR
    -- on commence par récupérer tous les clients, par région et par mois
    	SELECT 
    		DISTINCT 
    		clientcde, 
    		annee,
    		mois,
    		region
    	FROM
    		testg
    	WHERE
    		annee >= 2011
    OPEN Q1    	
    FETCH NEXT FROM Q1 INTO @clientcde, @annee, @mois, @region 
    WHILE (@@FETCH_STATUS = 0)
    BEGIN
    	-- pour chaque client, pour une région et un mois donné, on regarde si il existe dans la table testg dans les deux mois précédents
    	IF @clientcde IN (SELECT DISTINCT clientcde FROM testg WHERE annee = 2012 AND mois BETWEEN @mois -2 AND @mois -1) 
    		BEGIN
    			-- si oui on le fait apparaitre dans la table résultat
    			INSERT INTO @result values (@annee, @mois, @region, @clientcde)
    		END
     
    	FETCH NEXT FROM Q1 INTO @clientcde, @annee, @mois, @region
    END
    CLOSE Q1
    DEALLOCATE Q1
     
    select region, mois, count(clientcde) from @result group by region, mois order by region, mois

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 197
    Points : 12 772
    Points
    12 772
    Par défaut
    Bonjour,
    Tu dois pouvoir le faire en utilisant des alias:
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    select t1.*
    from testg as t1
    inner join testg as t2 on t1.ClientCde = t2.ClientCde
    where t1.annee >= 2011 and t2.annee = 2012 and T2.mois between t1.mois - 2 and t1.mois - 1
    Vérifie quand même si j'ai bien retranscris les conditions ...

    Tatayo.

  3. #3
    Membre habitué Avatar de Avatar
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Juillet 2005
    Messages
    136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 136
    Points : 150
    Points
    150
    Par défaut
    merci! ça a l'air d'être bon

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

Discussions similaires

  1. Différence entre majuscule et minuscule dans une requête
    Par Asdorve dans le forum Langage SQL
    Réponses: 2
    Dernier message: 23/06/2004, 14h42
  2. Utilisation de MAX dans une requête SQL
    Par Evil onE dans le forum Langage SQL
    Réponses: 7
    Dernier message: 15/06/2004, 18h38
  3. calcul dans une requête
    Par blaz dans le forum Langage SQL
    Réponses: 8
    Dernier message: 22/12/2003, 10h31
  4. [SQL] Renommer un champ dans une requête
    Par martonpylon12 dans le forum Requêtes et SQL.
    Réponses: 8
    Dernier message: 15/11/2003, 01h59
  5. petit probleme dans une requte POSTGRE SQL
    Par ghis le fou dans le forum Requêtes
    Réponses: 5
    Dernier message: 08/09/2003, 13h51

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