0

MS Access にテーブル (Product_Id、カテゴリの優先度、属性 1、属性 2...) があり、データをカテゴリ別にグループ化し、優先度の高い順に並べ替えるクエリを作成しようとしています。優先度は 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 照合順序: Null 値が照合 (並べ替え) される場所を指定する Long 値 (読み取り専用)。Microsoft Jet プロバイダーの場合、値は常に 4 であり、NULL 値がリストの最下位で並べ替えられることを示します。 ."

プロパティ NULL Collat​​ion Order がプロバイダーに対して読み取り専用であるという事実は、Jet エンジンに NULL 照合が 1 つしかないことを強く示唆しています。

于 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 に答える