2009-07-17 8 views
1

Problème:
Au départ, j'avais une requête qui fonctionnait très bien mais je dois maintenant la changer pour tirer plus de champs. Lorsque j'essaie d'exécuter la nouvelle requête, elle choisit un nom de champ et dit que je ne l'ai pas incluse dans la fonction d'agrégat. Chaque fois que j'obtiens cette erreur, je peux ajouter le champ que l'erreur spécifie à l'instruction Group By et le message d'erreur choisira un nouveau champ qui n'est pas inclus. Quelqu'un at-il une idée de comment je peux obtenir la même information que je recevais avec la requête originale juste avec plus de champs?Pourquoi ma requête nécessite-t-elle plus de champs dans mon groupe?

Description de la façon dont la requête est censé fonctionner:
La requête est destinée à tirer un enregistrement pour chaque ensemble distinct de readings_miu_id s et ReadDate s (Le champ PREMID est le même pour chaque distincte readings_miu_id).

Recherche d'origine:

strSql3 = " SELECT Distinct readings_miu_id, ReadDate, PremID " & _ 
      "INTO analyzedCopy2 " & _ 
      "FROM analyzedCopy " 

DoCmd.SetWarnings False 
DoCmd.RunSQL strSql3 
DoCmd.SetWarnings True 

Nouvelle requête:

strSql3 = " SELECT Top 1 readings_miu_id, Reading, ReadDate,Format([MIUtime],'hh:mm:ss') AS ReadTime,MIUwindow,SN,Noise,RSSI,ColRSSI,MIURSSI,Firmware,CFGDate,FreqCorr,Active,MeterType,OriginCol,ColID,Ownage,SiteID,PremID , Neptune_prem.prem_group1, Neptune_prem.prem_group2,ReadID " & _ 
      "INTO analyzedCopy2 " & _ 
      "FROM analyzedCopy " & _ 
      "Group By readings_miu_id, ReadDate, PremID " & _ 
      "Order By readings_miu_id, ReadDate, ReadID, PremID " 

DoCmd.SetWarnings False 
DoCmd.RunSQL strSql3 
DoCmd.SetWarnings True 
+1

Pourquoi vous regroupez-vous? il ne semble pas y avoir d'agrégats dans votre requête. – YonahW

+0

Parce que j'ai besoin de l'enregistrement TOP 1 pour chaque regroupement de combinaison readings_miu_id/ReadDate Distinct et on m'a déjà dit qu'utiliser une instruction Group By avec lui était une façon de le faire. – Bryan

+0

TOP N ne fonctionne jamais sur des ensembles individuels. C'est-à-dire, lorsque SELECT TOP N est la clause externe principale de votre requête, vous n'obtiendrez que N valeurs correspondantes (pas d'enregistrements, mais des valeurs, comme TOP N dans Jet/ACE renvoie des liens).Votre TOP 1 ne retournera qu'une seule valeur correspondante. –

Répondre

1

Lorsque vous ajoutez une clause GROUP BY, chaque champ doit être soit dans le GROUP BY ou ont une fonction d'agrégation (par exemple, MAX, MIN, SUM, COUNT) appliquée.

Par exemple, une implémentation simple correcte pourrait être:

SELECT Département, MAX (SALAIRE) FROM employés du département GROUP BY

... et une implémentation simple serait incorrecte:

SELECT Département, Salaire DE Employés GROUP BY Département.

Considérons les deux instructions ci-dessus. Pour le premier, vous pouvez facilement imaginer à quoi ressemblerait une source de données et ce qui serait retourné. Cependant pour le second, que feriez-vous revenir? Quelle valeur individuelle du salaire reviendrais-tu dans ton résultat? Par conséquent, lorsque vous regroupez des champs, chaque champ de l'ensemble de résultats doit soit participer au regroupement, soit être le résultat d'une agrégation des valeurs collectées dans le groupe constitué des autres champs.

+0

Je pensais que quelque chose comme TOP 1 aurait fait cela aussi, mais je suppose que non. – Bryan

3

Dans mon expérience (qui est seulement modérée) chaque colonne dans le jeu de résultats (mais pas tous les agrégats) doit être dans le groupe par.

Here's a decent reference

1

Vous pouvez accomplir ceci via une sous-requête ou deux requêtes. En outre, "CurrentDb.Execute" est la méthode préférée pour exécuter une requête comme celle-ci (au lieu de "DoCmd.RunSQL").

CurrentDb.Execute strSQL3, dbFailOnError