Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access > Requêtes et SQL.
Requêtes et SQL. Tout ce qui concerne vos questions sur les requêtes et le SQL sous Access se trouve ici.
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 10/01/2012, 17h00   #1
Candidat au titre de Membre du Club
 
Inscription : juin 2006
Messages : 35
Détails du profil
Informations personnelles :
Localisation : Canada

Informations forums :
Inscription : juin 2006
Messages : 35
Points : 11
Points : 11
Par défaut Populer colonne rang d'un Top 10

Bonjour,

J'ai une table de détention de titres en portefeuille et je tente de faire un Top 10. Je réussi à sélectionner les Top 10 pour chacun des comptes mais j'aimerais populer une colonne Rang qui me donnerait le rang dans le Top 10 de chaque titre.

Je suis aussi capable d'updater le Top 1, comme dans le code ci-dessous mais je ne sais pas trop comment faire pour les 9 suivant.
Voici la requête que j'ai faite jusqu'à maintenant:

Code :
1
2
3
4
5
6
UPDATE ÉmetteurTotal SET Rang=1 
WHERE Pourcentage In 
(Select Top 1 Pourcentage 
From ÉmetteurTotal As Temp 
Where Temp.Account_Name=ÉmetteurTotal.Account_Name 
Order By Pourcentage DESC)
J'ai eu ce code de ce même forum.

J'ai pensé faire une boucle et faire insérer dans le code Top i où i va de 1 à 10 et à sélectionner le Min de cette requête mais ça ne marche pas...

J'ai besoin de votre aide.

Merci et bonne journée!

Gringo
Gringo59 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/01/2012, 22h01   #2
Modérateur
 
Homme René MAROT
Inscription : octobre 2005
Messages : 5 479
Détails du profil
Informations personnelles :
Nom : Homme René MAROT
Localisation : Canada

Informations forums :
Inscription : octobre 2005
Messages : 5 479
Points : 7 568
Points : 7 568
L'astuce pour calculer un rang en SQL c'est de compter les enregistrements qui te précédent.

Un truc du style :
Code :
DCount("[TaClef]"; "[TaSource]"; "[TaClef]<=" & [TaSource].[TaClef])
Compte tous les enregistrements dont la clef est inférieure ou égale à la clef courante.

Autre solution, faire un petit bout de VBA qui va mettre à jour le champ rang dans ta source en comptant simplement les enregistrements.

A+
__________________
Vous voulez une réponse rapide et efficace à vos questions téchniques ? Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
marot_r est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 11/01/2012, 15h03   #3
Candidat au titre de Membre du Club
 
Inscription : juin 2006
Messages : 35
Détails du profil
Informations personnelles :
Localisation : Canada

Informations forums :
Inscription : juin 2006
Messages : 35
Points : 11
Points : 11
Bonjour marot_r,

Merci pour la réponse.

Citation:
Autre solution, faire un petit bout de VBA qui va mettre à jour le champ rang dans ta source en comptant simplement les enregistrements.
J'aimerais savoir à quoi ressemblerait ce bout de code. C'est ce que j'ai de la misère à déterminer, je ne sais pas comment le faire.

Merci et bonne journée!

Gringo
Gringo59 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2012, 16h23   #4
Candidat au titre de Membre du Club
 
Inscription : juin 2006
Messages : 35
Détails du profil
Informations personnelles :
Localisation : Canada

Informations forums :
Inscription : juin 2006
Messages : 35
Points : 11
Points : 11
Bonjour à tous,

J'ai réussi à faire des lignes de code qui règlent mon problème. Je ne suis pas sûr que ce soit ce qui est le plus efficace mais ça marche.

Je poste mon code pour ceux que ça pourrait intéresser.

Code :
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
 
Dim SommeVM(10) As Double, Compte(10) As String, i As Integer, rs As ADODB.Recordset, StrSQL As String, NomCompte As String
Set cnConnect = CurrentProject.Connection
cnConnect.Execute ("Delete * From ÉmetteurTotal")
'Sélection dans une table temporaire pour pouvoir grouper par la suite
cnConnect.Execute ("SELECT TableDéfinitions.Account_Name, Portefeuilles.Acct_Num_KEY, [Table Cusip Parent].Parent_Name, Portefeuilles.Settled_Base_Ccy_Mkt_Val INTO ÉmetteurTemp FROM (Portefeuilles INNER JOIN TableDéfinitions ON Portefeuilles.Acct_Num_KEY = TableDéfinitions.Acct_Num_KEY) INNER JOIN [Table Cusip Parent] ON Left(Portefeuilles.Client_Sec_Num,6) = [Table Cusip Parent].Company_Cusip WHERE (((Portefeuilles.Security_Description) <> 'Prêts')) GROUP BY TableDéfinitions.Account_Name, Portefeuilles.Acct_Num_KEY, [Table Cusip Parent].Parent_Name, Portefeuilles.Settled_Base_Ccy_Mkt_Val")
'Insertion dans la table ÉmetteurTotal avec le groupement, trié par Account_Name et SommeVM
cnConnect.Execute ("INSERT INTO ÉmetteurTotal ( Account_Name, Parent_Name, SommeVM ) SELECT ÉmetteurTemp.Account_Name, ÉmetteurTemp.Parent_Name, Sum(ÉmetteurTemp.Settled_Base_Ccy_Mkt_Val) AS SommeVM From ÉmetteurTemp GROUP BY ÉmetteurTemp.Account_Name, ÉmetteurTemp.Parent_Name ORDER BY ÉmetteurTemp.Account_Name, Sum(ÉmetteurTemp.Settled_Base_Ccy_Mkt_Val) DESC")
cnConnect.Execute ("Drop Table ÉmetteurTemp")
 
Compte(1) = "A"
Compte(2) = "B"
Compte(3) = "C"
Compte(4) = "D"
Compte(5) = "E"
Compte(6) = "F"
Compte(7) = "G"
Compte(8) = "H"
Compte(9) = "I"
Compte(10) = "J"
 
For i = 1 To 10
    'Calcul de la somme totale par compte
    SommeVM(i) = cnConnect.Execute("Select Sum(SommeVM) From ÉmetteurTotal Where Account_Name = '" & Compte(i) & "'").Collect(0)
    'Insertion du pourcentage
    cnConnect.Execute ("Update ÉmetteurTotal Set Pourcentage = SommeVM / " & SommeVM(i) & " Where Account_Name = '" & Compte(i) & "'")
Next i
 
Set rs = New ADODB.Recordset
'Sélection du Top 15 pour être sûr d'avoir 10 enregistrements avec les contraintes trié par Account_Name et Pourcentage
'pour pouvoir faire la mise à jour sur des enregistrements successifs
StrSQL = "Select Account_Name, Parent_Name, Pourcentage From ÉmetteurTotal WHERE Pourcentage In (Select Top 15 Pourcentage From ÉmetteurTotal As Temp Where Temp.Account_Name = ÉmetteurTotal.Account_Name And IsNull(ÉmetteurTotal.Parent_Name)=False Order By Account_Name, Pourcentage DESC)"
rs.Open StrSQL, cnConnect, adOpenDynamic
rs.MoveFirst
cnConnect.Execute ("Update ÉmetteurTotal Set Rang = 1 Where Account_Name = '" & rs!Account_Name & "' And Pourcentage = " & rs!Pourcentage)
i = 1: NomCompte = rs!Account_Name
rs.MoveNext
Do Until rs.EOF
    'Condition sur Account_Name: si différent, on reset à 1 pour recommencer le Top 10
    If NomCompte = rs!Account_Name Then
        i = i + 1
    Else
        i = 1
        NomCompte = rs!Account_Name
    End If
    'Si le nombre d'enregistrements dans un même Account_Name est plus grand que 10, je n'ai pas besoin d'updater ma table
    If i <= 10 Then
    'Update de la table en utilisant le résultat de ma requête comme contraintes
        cnConnect.Execute ("Update ÉmetteurTotal Set Rang = " & i & " Where Account_Name = '" & rs!Account_Name & "' And Parent_Name = '" & rs!Parent_Name & "'")
        rs.MoveNext
    Else: rs.MoveNext
    End If
Loop
rs.Close: Set rs = Nothing: cnConnect.Close: Set cnConnect = Nothing
End Sub
Si vous avez une solution plus efficace, svp m'en faire part.

Gringo
Gringo59 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 22h38.


 
 
 
 
Partenaires

Hébergement Web