2008-12-22 11 views
0

J'ai la table (ID_produit, priorité de catégorie, atribute1, atribute2 ...) dans MS Access, et j'essaie de faire une requête qui ordonne les données regroupées par catégorie et ordonnées par la plus haute priorité. La priorité peut être nulle, donc elle devrait être placée à la fin. Exemple: TableauComment commander une requête SQL avec des lignes groupées

1, 100, 2, atr1, atr2 
2, 300, , atr1, atr2 
3, 100, 5, atr1, atr2 
4, 200, 9, atr1, atr2 
5, 100, , atr1, atr2 
6, 200, 1, atr1, atr2 

Résultat attendu dans la requête:

6, 200, 1, atr1, atr2 
4, 200, 9, atr1, atr2 
1, 100, 2, atr1, atr2 
3, 100, 5, atr1, atr2 
5, 100, , atr1, atr2 
2, 300, , atr1, atr2 

Répondre

3

Dans Jet SQL, cela peut convenir:

SELECT t2.MinOfPriority, tn.Field2, Nz([tn.Field3],999) AS Priority, 
     tn.Field4, tn.Field5 
FROM tn 
INNER JOIN (SELECT Min(Nz(tn.Field3,999)) AS MinOfPriority, tn.Field2 
      FROM tn GROUP BY tn.Field2) AS t2 ON tn.Field2 = t2.Field2 
ORDER BY t2.MinOfPriority, tn.Field2, Nz([Field3],999); 
+0

bah vous venez de me battre :) Question votre «table» dans la jointure interne est nettement plus compliquée que l'exemple que j'ai utilisé. Je ne suis pas sûr que ce soit nécessaire. –

+0

Je travaillais avec ZLS pas Null champs de couper-coller :(. Je l'ai corrigé – Fionnuala

+0

"En Jet SQL, cela peut convenir" - non, parce que Jet SQL ne supporte pas la fonction NZ(). ont dit, "Dans MS Access ..."ou similaire parce que la fonction NZ() est fournie par l'interface MS Access.Dans Jet en dehors de l'interface MS Access vos erreurs SQL: Undefined fonction 'NZ' dans l'expression – onedaywhen

0

Vous devez pondérer les catégories (je suis nul avec pondération une valeur suffisamment grande):

select t1.* 
from myTable t1 
join 
( 

    select category, min(coalesce(priority, 1000)) weight 
    from myTable 
    group by category 
) t2 
on t1. category = t2. category 
order by t2.weight, coalesce(t1. priority, 1000) 
+0

MS Jet a gagné ' Je comprends cela. – Tomalak

+0

essayez isnull (priorité, 1000) –

+0

En fait, vous devez "ordre par t2.weight desc" et utiliser "isnull (t1.priority, 0)" et max() - ou comment je comprends la question originale :) – Arvo

-1

Pour autant que je sache, Jet toujours trie les valeurs NULL à la fin d'un ensemble de résultats lorsqu'un ORDER BY explicite est utilisé.

Voir: ADO Provider Properties and Settings

« NULL Collation Ordre:. Une valeur à long (lecture seule) qui spécifie où les valeurs NULL sont rassemblées (triées) Pour le fournisseur Microsoft Jet, la valeur est toujours 4, ce qui indique que les valeurs nulles sont triées à l'extrémité inférieure de la liste. " Le fait que la propriété NULL Collation Order soit en lecture seule pour le fournisseur suggère fortement que le moteur Jet n'a qu'un seul classement NULL et, heureusement pour vous, c'est celui que vous désirez.

+0

Si "les calus null sont triés à l'extrémité inférieure de la liste", alors le Les valeurs nulles apparaîtront en premier sur la liste. c'est contraire à la question où nul "devrait être placé à la fin". –

+0

Ron, vous semblez avoir mal interprété la signification de "bas de gamme". Le mot clé ici est "fin". Pensez à un jeu d'enregistrements: les valeurs NULL seront triées aux positions les plus proches de l'EOF (* fin * du fichier). Avez-vous testé avec Jet? Essayez-le et je pense que vous serez d'accord que les valeurs NULL n'apparaissent pas en premier. – onedaywhen

-1

Apparently NZ (valeur ValueToReturnIfNull) peut être utilisé sur MSAccess comme substitut pour ISNULL si ...

SELECT a.* 
FROM this_table AS a 
    INNER JOIN 
    (
     SELECT category,min(NZ(priority,999999)) as min_priority_in_cat 
     FROM this_table group by category 
    ) AS b ON a.category = b.category 
ORDER BY b.min_priority_in_cat, a.category, NZ(a.priority,999999) 
+0

Merci beaucoup Ron, mais ça ne marche pas encore complètement, ça fonctionne parfaitement s'il y a des priorités définies, dès qu'il y a plus d'une catégorie sans priorité alors ces catégories ne sont pas –

+0

Je ne suis pas sûr (e) que je suis: ce qui précède devrait aboutir à ce que n'importe quelle catégorie n'ait qu'une priorité NULL en bas Si vous voulez trier ces catégories (celles qui n'ont que NULL comme priorités) ac ategory jusqu'à la fin de la clause ORDER BY. Laissez-moi savoir, je vais ensuite mettre à jour. –

+0

merci encore Ron, c'est tout, j'ai ajouté la a.category après b.min_priority_in_cat et fonctionne parfaitement. Je l'ai trouvé à partir de Remou (tn.Field2). Merci de votre aide! –

1

La solution la plus simple (pas nécessairement le meilleur dans certains cas) est d'utiliser des numéros de colonne dans vos expressions de commande:

SELECT t2.MinOfPriority, 
     tn.Field2, 
     Nz([tn.Field3],999) AS Priority,   
     tn.Field4, 
     tn.Field5 

ORDER BY 1,2,3 
Questions connexes