Как заказать SQL-запрос с сгруппированными строками - PullRequest
0 голосов
/ 22 декабря 2008

У меня есть таблица (Product_Id, приоритет категории, атрибут1, атрибут2 ...) в MS Access, и я пытаюсь сделать запрос, который упорядочивает данные, сгруппированные по категориям и упорядоченные по наивысшему приоритету. Приоритет может быть нулевым, поэтому его следует поместить в конце. Пример: Таблица

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

Ответы [ 5 ]

3 голосов
/ 22 декабря 2008

В 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);
1 голос
/ 05 января 2009

Самое простое решение (не обязательно лучшее в некоторых случаях) состоит в использовании номеров столбцов в выражениях заказа:

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

ORDER BY 1,2,3
0 голосов
/ 22 декабря 2008

Очевидно, 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)
0 голосов
/ 22 декабря 2008

Насколько я знаю, Jet всегда сортирует значения NULL до конца набора результатов, когда используется явный ORDER BY.

См .: Свойства и настройки поставщика ADO

"Порядок сортировки NULL: длинное значение (только для чтения), указывающее, где сопоставляются (сортируются) нулевые значения. Для поставщика Microsoft Jet значение всегда равно 4, что указывает на то, что нулевые значения сортируются на нижнем уровне. списка. "

Тот факт, что свойство NULL Collation Order доступно только для чтения для провайдера, убедительно свидетельствует о том, что у Jet-движка есть только одно NULL-сопоставление, и, к счастью для вас, это именно то, что вам нужно.

0 голосов
/ 22 декабря 2008

Вам нужно взвесить категории (я взвешиваю ноль с некоторым достаточно большим значением):

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)   
...