Requete SQL qui ne fonctionne pas

Requete SQL qui ne fonctionne pas - SQL/NoSQL - Programmation

Marsh Posté le 03-02-2004 à 20:29:08    

J'ai une requete SQL
SELECT top 10 resultat.NoJoueur,
       resultat.hit,
       count (resultat.nojoueur) as TotalPre,
       joueurs.prenom,
       joueurs.nom,
       EquipeMstr.NomEquipe
      FROM resultat, joueurs, EquipeDetl, EquipeMstr
      WHERE (resultat.NoJoueur = joueurs.NoJoueur) and
            (EquipeDetl.NoJoueur = Resultat.NoJoueur and
        EquipeDetl.Annee = " & session.Contents("Annee" ) & " ) and
           (EquipeMstr.NoEquipe = EquipeDetl.NoEquipe)
     GROUP BY resultat.NoJoueur.
 
Qui ne fonctionne pas. Ce qui ne marche pas c'est la fonction Count. Quand j'enleve le count et le Group by tout fonctionne a merveille! SQL me renvoit un message comme quoi le champ apres le count n'est pas contenu dans un agregat blablabla  :pt1cable:  
 


---------------
MauditOstie... Progress Rules
Reply

Marsh Posté le 03-02-2004 à 20:29:08   

Reply

Marsh Posté le 03-02-2004 à 20:56:07    

un fonction d'aggreagation regroupe plusieurs valeurs, c'est pour ça que pour chaque fonction d'aggrétation utilisée, il faut un group by correspondant.  
 
COUNT(machin)  --> GROUP BY(machin)

Reply

Marsh Posté le 03-02-2004 à 20:59:28    

Ouiais je sais, c'est pourquoi j'ai mon

Citation :

count (resultat.nojoueur) as TotalPre,  
ET GROUP BY resultat.NoJoueur.  


 
Toutefois MSSQL semble ne pas aimer ma string!


---------------
MauditOstie... Progress Rules
Reply

Marsh Posté le 03-02-2004 à 21:01:59    

attention à placer au bon endroit le GROUP BY

Reply

Marsh Posté le 03-02-2004 à 21:02:36    

pis attention ->  
 
count (resultat.nojoueur) as TotalPre,  
ET GROUP BY resultat.NoJoueur

Reply

Marsh Posté le 03-02-2004 à 21:04:14    

On ma toujours dit que SQL Server 2000 etait pas casesensitive...
l'est-il? Ou bien est-ce simplement a cause que c'est une fonction d'aggregation?


---------------
MauditOstie... Progress Rules
Reply

Marsh Posté le 03-02-2004 à 21:05:35    

donne ta requête complète stp. (non il est pas case-sensitive, mais c'est pas une raiso :o)

Reply

Marsh Posté le 03-02-2004 à 21:07:01    

Bien je l'ai donne dans le premier message. C'est ma requete complete! C'est ca que j'ai besoin....


---------------
MauditOstie... Progress Rules
Reply

Marsh Posté le 03-02-2004 à 21:08:18    

Ca se trouve a etre un fichier .ASP pour un petit site web que je fais.


---------------
MauditOstie... Progress Rules
Reply

Marsh Posté le 03-02-2004 à 21:12:18    

Voila le coin de mon code complet:  
 if request.querystring("Query" ) <> "" then
       dim objConn, objComm, objRS
       dim vNoJoueur, vNoEquipe
 
          vNoJoueur = request.Cookies("NoJoueur" )
    vNoEquipe = request.cookies("NoEquipe" )
   
          set objConn = server.CreateObject("ADODB.connection" )    
       set objComm = Server.CreateObject("ADODB.Command" )
       
          objConn.Open "driver=SQL server;" & _
                       "server=sergeserver;" & _  
                    "uid=BASMUser;pwd=BASMUser;database=BASMSql"      
         
       objComm.ActiveConnection = objConn
          objComm.CommandType = adCmdText
     
          objComm.CommandText = _  
        "SELECT top 10" & _
     "  resultat.NoJoueur, " & _
     "  resultat.hit, " & _
     "  count (resultat.noJoueur) 'TotalPre' , " & _
     "  joueurs.prenom, " & _
     "  joueurs.nom, " & _
     "  EquipeMstr.NomEquipe " & _
     "FROM resultat, joueurs, EquipeDetl, EquipeMstr " & _
     "WHERE (resultat.NoJoueur = joueurs.NoJoueur) and " & _
     "      (EquipeDetl.NoJoueur = Resultat.NoJoueur and " & _
     "       EquipeDetl.Annee = " & session.Contents("Annee" ) & " ) and " & _
     "      (EquipeMstr.NoEquipe = EquipeDetl.NoEquipe) " & _
     "GROUP BY resultat.noJoueur"  
     
     
     
                                 
       set objRS = objComm.execute  
   
        response.write "<div align='center'><font align='center' color='#FFFFFF' size='+1'><br>"
    while not objRS.EOF  
       response.write objRS("NoJoueur" )  & " " & _
                      objRS("Nom" )       & " " & _
                      objRS("Prenom" )    & " " & _  
                      objRS("Hit" )       & " " & _  
                      objRS("TotalPre" )  & " " & _  
                      objRS("NomEquipe" ) & "<BR>"
                       
    objRS.MoveNext
    wend  
     
    set objRS = nothing
    set objComm = nothing
    set objConn = nothing
          response.write "</font></div>"
  end if  


---------------
MauditOstie... Progress Rules
Reply

Marsh Posté le 03-02-2004 à 21:12:18   

Reply

Marsh Posté le 03-02-2004 à 21:48:21    

SELECT top 10 resultat.NoJoueur,  
       resultat.hit,  
       count (resultat.nojoueur) as TotalPre,  
       joueurs.prenom,  
       joueurs.nom,  
       EquipeMstr.NomEquipe  
      FROM resultat, joueurs, EquipeDetl, EquipeMstr  
      WHERE (resultat.NoJoueur = joueurs.NoJoueur) and  
            (EquipeDetl.NoJoueur = Resultat.NoJoueur and  
        EquipeDetl.Annee = " & session.Contents("Annee" ) & " ) and  
           (EquipeMstr.NoEquipe = EquipeDetl.NoEquipe)  
     GROUP BY resultat.hit, joueurs.prenom, joueurs.nom, EquipeMstr.NomEquipe
 
le champ en count est le seul qui soit dispensé d'être dans le group by...
 
(je dis ça de tête, j'ai pas de base sous la main pour tester)  


---------------
On ne vit qu'une fois, mais pour qui sait vivre, une seule fois suffit (Merril Stubbing)
Reply

Marsh Posté le 04-02-2004 à 17:10:34    

JagStang a écrit :

un fonction d'aggreagation regroupe plusieurs valeurs, c'est pour ça que pour chaque fonction d'aggrétation utilisée, il faut un group by correspondant.  
 
COUNT(machin)  --> GROUP BY(machin)


C'est le contraire. Dans le GROUP BY, y'a tout SAUF les champs participant aux fonctions d'agrégation.
 
Et le SQL n'est pas case sensitive. Si un SGBD l'est, alors c'est GOTO POUBELLE et n'en ressort pas.
 
PS: par contre, c'est case sensitive pour les valeurs.
 
select toto from machin order by TotO <= fonctionne
 
select toto from machin where toto like 'A%' c'est pas pareil que select toto from machin where toto like 'a%'
 
Pour ce second point, c'est généralement paramètrable au niveau de la base elle-même, car on a rarement besoin de faire la différence entre maj et min dans les champs texte.


Message édité par MagicBuzz le 04-02-2004 à 17:12:37
Reply

Marsh Posté le 04-02-2004 à 17:21:46    

MagicBuzz a écrit :


C'est le contraire. Dans le GROUP BY, y'a tout SAUF les champs participant aux fonctions d'agrégation.


 
+1
 
le champ en count est le seul qui soit dispensé d'être dans le group by... C'est ce que ça disait


---------------
On ne vit qu'une fois, mais pour qui sait vivre, une seule fois suffit (Merril Stubbing)
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed