Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server > Développement
Développement Forum d'entraide sur le Transact-SQL, le CLR, les procédures stockées, les triggers, les requêtes SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 05/07/2011, 09h04   #1
Candidat au titre de Membre du Club
 
Développeur Web
Inscription : janvier 2011
Messages : 48
Détails du profil
Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : janvier 2011
Messages : 48
Points : 13
Points : 13
Par défaut Procédure stockée problème

Bonjour, je dispose d'une table de la forme suivante:

[Email] | [Client] | [Date]....

ma procédure stockée doit avoir comme attribut deux dates et la valeur du client:
@Datestart
@Datestop
@Customer

Je voudrais récuperer l'ensemble des nouveaux clients pendant la période de date donnée.

Sachant que chaque ligne de la table correspond à un enregistrement d'un telechargement ex:

"email@mail1.com" | client 1 | 2011-06-06
"email@mail2.com" | client 2 | 2011-05-04
"email@mail1.com" | client1 | 2010-04-03
....
...
L'adresse mail des clients apparait à chaque enregistrement d'un telechargement, et donc en gros, je souhaiterais avoir la liste des nouvelles adresses mails pendant la pèriode donnée et qui ne sont pas dans la table avec le même client. (par ex si adresse1 est déja présente mais avec le client2, elle compte quand même pour un nouveau client pour le client1)

Code :
1
2
3
4
5
6
SELECT DISTINCT([Email]), COUNT(*) AS NB FROM TABLE
WHERE Customer= @Client
AND [Date]>@start AND [Date]<@end
AND [Email]<>(SELECT DISTINCT([Email]) FROM StatsArchived WHERE [Date]<@start)
GROUP BY [EMAIL]
ORDER BY NB DESC;
mais cela ne fonctionne pas.
Kirua76 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/07/2011, 09h18   #2
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Architecte de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : novembre 2004
Messages : 1 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
SELECT DISTINCT([Email]) AS Email
FROM TABLE A
WHERE Customer= @Client
AND A.[Date] BETWEEN @start AND @end
AND NOT EXISTS
(
   SELECT * 
   FROM TABLE B 
   WHERE Customer=@client 
      AND B.Email= A.Email 
      AND B.[Date]<@start
)
ORDER BY Email DESC
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/07/2011, 12h51   #3
Candidat au titre de Membre du Club
 
Développeur Web
Inscription : janvier 2011
Messages : 48
Détails du profil
Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : janvier 2011
Messages : 48
Points : 13
Points : 13
Merci beaucoup, la procédure stockée fonctionne, mais elle est beaucoup trop longue (environ 30 seconde pour s'éxécuter). Je pense qu'il n'y a pas mieu de toutes façon a part modifié la table pour crée une colonne qui va dire si c'est le premier enregistrement ou non de cet utilisateur.
Quand pensez vous? avez vous d'autre idée?
Kirua76 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/07/2011, 13h14   #4
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Bonjour,

vous pouvez créer un index pour accélérer la requête :
Code SQL :
1
2
 
CREATE INDEX IX_NomIndex ON LaTable (Customer, [date], Email)


Vous pouvez aussi essayer cette requête :
Code SQL :
1
2
3
4
5
6
 
SELECT Email
FROM TABLE
WHERE Customer = @Client
GROUP BY Email
HAVING MIN([date]) BETWEEN @Datestart AND  @Datestop
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2011, 09h14   #5
Candidat au titre de Membre du Club
 
Développeur Web
Inscription : janvier 2011
Messages : 48
Détails du profil
Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : janvier 2011
Messages : 48
Points : 13
Points : 13
Merci cela fonctionne. On m'a conseillé de faire cette requête avec un LEFT OUTER JOIN. Avez vous une idée de comment faire?

Merci beaucoup pour toutes ces réponses.
Kirua76 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2011, 10h08   #6
Candidat au titre de Membre du Club
 
Développeur Web
Inscription : janvier 2011
Messages : 48
Détails du profil
Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : janvier 2011
Messages : 48
Points : 13
Points : 13
Pour le moment j'ai fait ceci:

Code :
1
2
3
4
5
SELECT [Email], MIN([date])
	FROM TABLE A
	WHERE Customer= @Customer
	AND A.[Date] BETWEEN @start AND @stop
	GROUP BY [Email]
donc la, je récupère toutes les données comprises dans la période avec le client=@Customer, maintenant il faut que je fasse un "left outer join" pour enlever celle déjà présente avant cette période.
Kirua76 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2011, 11h33   #7
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
ça donnerait ça :


Code SQL :
1
2
3
4
5
6
7
8
9
10
 
SELECT A.[Email], A.MIN([date])
FROM TABLE A
LEFT OUTER JOIN TABLE B
    ON A.Customer = B.Customer
    AND B.[date] < @Start
WHERE A.Customer= @Customer
    AND A.[Date] BETWEEN @start AND @stop
    AND B.Customer IS NULL
GROUP BY [Email]

Mais je doute que cette requête vous apporte de meilleurs performances que celle proposée par Ibersek.


Avez-vous créé l'index ? quels sont les résultats ?
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/07/2011, 09h40   #8
Candidat au titre de Membre du Club
 
Développeur Web
Inscription : janvier 2011
Messages : 48
Détails du profil
Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : janvier 2011
Messages : 48
Points : 13
Points : 13
Il y avait encore quelques erreurs au sujet d’ambiguïté(pour la dernière requête).
Je vais utiliser la requête qui comporte le "having".

Merci beaucoup
Kirua76 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 23h26.


 
 
 
 
Partenaires

Hébergement Web