Requete SQL Server

Résolu/Fermé
soleil_levant Messages postés 393 Date d'inscription lundi 15 septembre 2008 Statut Membre Dernière intervention 14 avril 2011 - 16 sept. 2009 à 11:12
soleil_levant Messages postés 393 Date d'inscription lundi 15 septembre 2008 Statut Membre Dernière intervention 14 avril 2011 - 22 sept. 2009 à 10:34
Bonjour,
Je souhaite faire une requete plus au moins complexe. Mon idée était de passer par des curseurs et Transac-SQL. Je maitrise pas trop et surtout que c'est instable parait-il sur SQL Server.

Je souhaite sélectionner les clients qui ont recu plus de 1000 euros d'au moins 3 clients différents.

SELECT ID, NOM, PRENOM, DATENAISSANCE, MONTANT, NOM_ENVOI, PRENOM_ENVOI
FROM qryTransactions
WHERE LTRIM(RTRIM(NOM))+LTRIM(RTRIM(PRENOM))+LTRIM(RTRIM(DATENAISSANCE)) IN (
SELECT LTRIM(RTRIM(NOM))+LTRIM(RTRIM(PRENOM))+LTRIM(RTRIM(DATENAISSANCE)) SUM(MONTANT)
GROUP BY LTRIM(RTRIM(NOM))+LTRIM(RTRIM(PRENOM))+LTRIM(RTRIM(DATENAISSANCE))
HAVING SUM(MONTANT) >= 1000)

/* La je sélectionne que les clients qui ont recu plus de 1000. le ltrim(rtrim()) me permet de supprimer les espaces car la base contient des erreurs de saisie

Maintenant je souhaite intégrer une ou plusieurs conditions pour sélectionner ceux qui on recu (les colonnes Nom_envoi et prenom_envoi) d'au moins de 3 envoyeurs différents.

Avez vous une idée s'il vous plaît??

Merci d'avance,
A voir également:

7 réponses

incaout Messages postés 347 Date d'inscription lundi 8 septembre 2008 Statut Membre Dernière intervention 15 novembre 2012 74
16 sept. 2009 à 16:54
Salut.

Je ne suis pas familier du SQL Server. Il y a un truc que je ne comprend pas dans ta requete. Pourquoi tu n'utilises pas l'id dans la condition where plutot que le nom, le prenom et la date de naissance ? J'ai aussi l'impression qu'il manque une clause FROM dans la requete de la condition

Un truc du genre :

SELECT ID, LTRIM(RTRIM(NOM)), LTRIM(RTRIM(PRENOM)), DATENAISSANCE, MONTANT, NOM_ENVOI, PRENOM_ENVOI
FROM qryTransactions
WHERE ID IN (
SELECT ID, SUM(MONTANT) FROM "latablemanquante" GROUP BY ID HAVING SUM(MONTANT) >= 1000)

Qu' y a t'il dans qryTransactions ?

Pour ce qui est de ta question, je ferais une requete qui compte le nombre des différents d'envoyeurs pour un client et ensuite j'appliquerai une condition pour que seuls les enregistrements qui ont un résultat >=3 soient affichés.

Si la requete est trop complexe à créer alors, tu as en effet raison d'utiliser le transac sql qui d'après ce que j'ai lu permet d'écrire des procédures stockées. Voici un lien qui peut t'aider :

https://sqlpro.developpez.com/cours/sqlserver/transactsql/

Bon courage

Cdlt

IC
0
soleil_levant Messages postés 393 Date d'inscription lundi 15 septembre 2008 Statut Membre Dernière intervention 14 avril 2011 32
17 sept. 2009 à 09:36
Bonjour,
Merci pour ta réponse.
En ce qui concerne ma requête, le ID est composé de deux colonnes (num et année). Je veux pas bosser sur les ID, c'est clair c'est un peu plus long l'exe de mes requetes, mais c'est le fonctionnement final qui l'exige.

Le qryTransactions c'est une vue de Table. Mon entreprise de stage me donne accès qu'à cette vue la. La polémique était de travailler sur les tables mais ils refusent catégoriquement.

enfin, ma requete est bonne, faut juste enlever le premier sum dans la sou-requete select.

Elle sert à sélectionner les clients qui ont recu plus de 1000 durant une période, la concat avec + et trim sert à régler kk problèmes de espaces et saisie incorrectes des noms dans la base c'est pour ça.

Ma question est d'éviter les transac SQL ou curseurs. Moi perso suis habitué avec ORacle (formation école). Mais sql Server est un peut pareil à pars kk packages..

Pour ta réponse :
Pour ce qui est de ta question, je ferais une requete qui compte le nombre des différents d'envoyeurs pour un client et ensuite j'appliquerai une condition pour que seuls les enregistrements qui ont un résultat >=3 soient affichés.

As tu un moyen ? peut s'il te plait me montrer un bout de code?

Merci d'avance
0
incaout Messages postés 347 Date d'inscription lundi 8 septembre 2008 Statut Membre Dernière intervention 15 novembre 2012 74
17 sept. 2009 à 13:19
Salut.

Voici un exemple de requête qui s'apparente à ce que tu veux faire. Comme je n'ai pas tes tables sous la main et que je voulais tester, j'ai essayé dans un de mes projets.

Le contexte est le suivant.

Une personne possède un programme de formation et reçoit des cours. Un ou plusieurs formateurs peuvent intervenir. Une table Releve_Activite permet d'enregistrer les informations concernant chaque cours donné, notamment la reférence du programme, le numéro de l'intervenant. La requete ci-dessous permet de calculer pour chaque programme combien d'intervenants différents il y a eu :

SELECT Releve_Activite.RefProg, COUNT(2) FROM (
SELECT Releve_Activite.RefProg, Count(Releve_Activite.RefEns) AS CompteDeRefEns, Releve_Activite.RefEns
FROM Releve_Activite
GROUP BY Releve_Activite.RefProg, Releve_Activite.RefEns
HAVING (((Releve_Activite.RefProg)>0))
ORDER BY Releve_Activite.RefProg)
GROUP BY Releve_Activite.RefProg

Et si maintenant tu souhaites extraire les programmes dont le nb d'intervenants différents est >= 3 :

SELECT Releve_Activite.RefProg AS Expr1, Count(2) AS Expr2
FROM (SELECT Releve_Activite.RefProg, Count(Releve_Activite.RefEns) AS CompteDeRefEns, Releve_Activite.RefEns
FROM Releve_Activite
GROUP BY Releve_Activite.RefProg, Releve_Activite.RefEns
HAVING (((Releve_Activite.RefProg)>0))
ORDER BY Releve_Activite.RefProg)
GROUP BY Releve_Activite.RefProg
HAVING (((Count(2))>=3));

A adapter à ton cas en sachant que j'ai testé sous Access 2000, qui prend certains arrangement avec le SQL.

Cdlt

IC
0
soleil_levant Messages postés 393 Date d'inscription lundi 15 septembre 2008 Statut Membre Dernière intervention 14 avril 2011 32
17 sept. 2009 à 14:08
Salut,

merci infiniment incaout :)

je vais tester ça tout à l'heure et te tiendrais au courant, je la teste ti suite :) tiens :)

Te tiens et courant et merci encore.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
soleil_levant Messages postés 393 Date d'inscription lundi 15 septembre 2008 Statut Membre Dernière intervention 14 avril 2011 32
21 sept. 2009 à 15:16
Bonjour INCAOUT!!

Je tiens à te remercier pour ton intéret d'abord. Ensuite je reviens vers toi pour te donner des nouvelles concernant ma requête.

Ton aide est d'une très grande utilité!! Merci infiniment!! Franchement j'ai adopté ta requête à ma base SQL Server. Vu mon besoin et les erreurs de saisie dans la base, voici le sous requête essentielle qui répond à mon besoin, cad sélectionner les clients qui ont plusieurs Clients qui envoient. Durant une période donnée. Ensuite il manque mais pas important la requête mère si je puisse dire qui est peu longue.
Voici sous SQl Server la requête:
Use test_base
SELECT LTRIM(RTRIM(T2.P_REC_LASTNAME))+LTRIM(RTRIM(T2.P_REC_FIRSTNAME))+LTRIM(RTRIM(T2.P_REC_BIRTHDATE)) As Client, COUNT(LTRIM(RTRIM(T2.P_SEN_LASTNAME))+LTRIM(RTRIM(T2.P_SEN_FIRSTNAME))) AS NbreCorrespondant
FROM qryTransactionDetails T2
WHERE T2.Adjustment_ID = '-1'
AND T2.PayDateLOCYear = 2009
AND T2.PayDateLOCMonth BETWEEN 1 AND 4
GROUP BY LTRIM(RTRIM(T2.P_REC_LASTNAME))+LTRIM(RTRIM(T2.P_REC_FIRSTNAME))+LTRIM(RTRIM(T2.P_REC_BIRTHDATE))
ORDER BY LTRIM(RTRIM(T2.P_REC_LASTNAME))+LTRIM(RTRIM(T2.P_REC_FIRSTNAME))+LTRIM(RTRIM(T2.P_REC_BIRTHDATE))

Ne me demande pas trop les colonnes et le reste car c'est confidentiel lol

Merci beaucoup et à +

Sujet résolut.
0
incaout Messages postés 347 Date d'inscription lundi 8 septembre 2008 Statut Membre Dernière intervention 15 novembre 2012 74
21 sept. 2009 à 17:03
Salut.

Très heureux d'apprendre que cela fonctionne pour toi. Bonne continuation pour la suite alors.

Cdlt

IC
0
soleil_levant Messages postés 393 Date d'inscription lundi 15 septembre 2008 Statut Membre Dernière intervention 14 avril 2011 32
22 sept. 2009 à 10:34
Thanks a lot :)
0