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