0

我在 MS Access 中有表(Product_Id,类别优先级,atribute1,atribute2 ...),我正在尝试进行查询,对按类别分组的数据进行排序,并按最高优先级排序。优先级可以为 Null,所以应该放在最后。示例:表格

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

查询中的预期结果:

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
4

5 回答 5

3

在 Jet SQL 中,这可能适合:

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);
于 2008-12-22T13:16:31.210 回答
1

最简单的解决方案(在某些情况下不一定是最好的)是在排序表达式中使用列号:

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

ORDER BY 1,2,3
于 2009-01-05T06:43:14.183 回答
0

您需要对类别进行加权(我用一些适当大的值加权 null):

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)   
于 2008-12-22T11:17:50.733 回答
-1

据我所知,当使用显式 ORDER BY 时,Jet总是将 NULL 排序到结果集的末尾。

请参阅:ADO 提供程序属性和设置

"NULL Collat​​ion Order: 一个 Long 值(只读),指定在哪里对 Null 值进行排序(排序)。对于 Microsoft Jet 提供程序,该值始终为 4,这表明空值在列表的低端排序。”

NULL Collat​​ion Order 属性对于提供者来说是只读的这一事实强烈表明 Jet 引擎只有一个 NULL 排序规则,而且对您来说很高兴,它就是您想要的。

于 2008-12-22T12:18:23.513 回答
-1

显然NZ(Value, ValueToReturnIfNull) 可以在 MSAccess 上用作 ISNULL 的替代品,所以......

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)
于 2008-12-22T13:19:35.230 回答